1

派生クラスが initWithNibName 呼び出しでスーパー クラスで定義されたプロパティを設定し、viewDidLoad が呼び出されるまでにプロパティが魔法のように再び未定義になるという問題が発生しています。それは次のようになります:

@interface BaseClassController : UIViewController
{
}

@property (copy, nonatomic) NSString *myString; // synthesized in the .m

別のファイルで

@interface DerivedClassController : BaseClassController
{
}

そしてその実装では:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        NSLog(@"Setting MyString stuff");
        self.myString = @"Hi Mom";
        NSLog(@"Done setting myString");
    }
    return self;
}

- (void)viewDidLoad
{
    NSLog(@"MyString is %@", self.myString); // output as (null)!!!
    [...]
}

NSLog の出力によると、順序は正しいです。私は、viewDidLoad が最初に呼び出されていないことを知っています。最初に initWithNibName メソッドが呼び出され、次に viewDidLoad が呼び出されます。viewDidLoad は毎回 self.myString を (null) として報告します。ただし、myString の初期化を viewDidLoad に移動すると、すべて正常に動作します。なんで?ここで本当に明白な何かが欠けているに違いありません..

編集:

これが違いを生むかどうかはわかりませんが、DerivedClassController は、モーダルに表示されるナビゲーション コントローラーのルート ビュー コントローラーです (あらゆる種類の従来の理由により)。

編集2:

コードはスタンドアロンの xcode プロジェクトで期待どおりに機能しますが、最終的に使用する必要があるプロジェクトにインポートすると失敗します。

4

2 に答える 2

0

同じコントローラーから両方の時間ログを記録していることを確認しますか?initWithNibName:bundle:たとえば、あるコントローラーで呼び出しているのに、viewDidLoad実際には別のコントローラーで呼び出されているのではないでしょうか。

于 2012-09-20T20:25:05.097 に答える
-1

コピーするように設定した理由はありますか?

プロパティを次のように設定してみてください。

@property (nonatomic, strong) NSString *myString;
于 2012-09-20T20:04:03.927 に答える