2011-10-21 19 views
3

まず、私はこれを徹底的に調査して、探しているものと一致するものを見つけることができませんでした。私の文字列がUIAlertViewに表示されない理由

私の問題はこれです:Class1で作成された文字列プロパティがあり、次に示すように合成されました。

@interface Class1 : UIViewController 
{ 
    NSString *testvar; 
} 

@property (nonatomic, retain) NSString *testvar; 

@end 



@implementation Class1 

@synthesize testvar 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.testvar = @"Test variable"; 
} 
@end 

これは、それがで定義されている同じviewDidLoadの方法で表示されたテストUIAlertViewに働くよう、変数/プロパティの値を定義するため正常に動作します。他のクラス、クラス2は、取得しようとする試みを行ったときに問題が発生しましたプロパティを使用します。次のように第二のクラスで使用されるコードは次のとおりです。

Class1 *foo = [[Class1 alloc]init]; 
UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Title" 
               message:foo.testvar 
               delegate:self 
            cancelButtonTitle:@"OK" 
            otherButtonTitles:nil]; 
[alert show]; 
[alert release]; 
[foo release]; 

何が起こるかというとUIAlertView表示していることですが、何のメッセージを持っていません。私はClass1 testvarプロパティの値は、Class2がそれを取得しようとする前にリリースされていると思う、または私はそれを間違って設定しています。私は同じことを試みたが、NSStringの代わりにintを使ったので、これを言う。 Class1のviewDidLoadでintの値を3に設定し、UIAlertViewが表示されたらintの値を示していましたが、設定値ではなくintのデフォルト値である "0"が表示されました。

Objective-Cに比較的新しく、まだメモリ管理の優れた把握力を持っていないので、エラーは自分の所有物の価値を設定する場所や方法と関係していると私は考えています。どんな洞察にも感謝します。前もって感謝します。

答えて

6

これは間違っています。 viewDidLoadメソッドは、別のクラスでビューを初期化するときにビューが描画されない場合にのみ呼び出されます。

Class1 - (id)initでメソッドを定義し、self.testvar = @ "Test Variable"を移動します。それにそれは期待どおりに動作するはずです。

- (id)init 
{ 
    if(self = [super init]) 
    { 
    self.testvar = @"Test Variable"; 
    } 
    return self; 
} 
+0

。どうもありがとう。 –

0

あなたはまだtestvarに何も割り当てていません。この時点ではまだオブジェクトは存在しません。

とにかく上記のコードに基づいて

foo.textvar = @"my message"; 

のようなものを移動する必要があります。

ところで、その時点でアラートを解除する必要はありません。アラート参照を返すデリゲートメソッドで解放します。

理解を深めるために完全なコードを貼り付けることはできますか?

+0

問題は既に解決されています。完全なコードで私は実際にtestvarを定義しました。私はObjective-C/Xcodeを数日間使用していましたが、すべてのメソッドの仕組みにまだ慣れていません。私は - (id)initと - (void)viewDidLoadが混在していました。私はあなたが代わりに代理人のアラートをリリースしたときにあなたが言ったことについてもっと知りたいと思っています。私が言ったように、私はまだメモリ管理についてよく知りません。 –

0

これはグローバル変数です。

これを1つのクラスに宣言して定義し、プロジェクト内の他のクラスで使用できます。

ClassAで文字列を宣言でき、ClassBで文字列を使用できます。

にClassA:

NSString *textVar = nil; 

textVar = @"Your Message"; 

ClassBの:それは今完璧に動作

extern NSString *textVar; 

UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Title 
           message:textVar  
           delegate:self 
           cancelButtonTitle:@"OK" 
           otherButtonTitles:nil]; 
           [alert show]; 
           [alert release]; 
関連する問題