2011-07-05 8 views
1

私はデリゲートを使用してアプリケーションのデータを保存しています。私は最初のビューコントローラとしてnavigationviewcontrollerを持つtabviewcontrollerを持っています。私がデリゲートを使用してdelegate = [[UIApplication sharedApplication] delegate]; initで動作しません:viewDidLoadのみ

delegate = [[UIApplication sharedApplication] delegate]; 

を使用すると、デリゲートはinitメソッドの外部でnullになります。
しかし、viewDidLoad内の場所がうまくいきます。これがなぜ起こるのか?

UPDATE

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     delegate = [[UIApplication sharedApplication] delegate]; 
    } 
    return self; 
} 
+0

どの初期化方法を上書きしていますか?呼び出されるのは、コントローラの作成方法によって異なります。 – Caleb

+0

- (id)initWithNibName:(NSString *)nibNameOrNilバンドル:(NSBundle *)nibBundleOrNil また、デリゲートはinitメソッド内に設定されていますが、 (例:viewDidLoad)、デリゲートはnull – James

+0

ですが、initメソッドの内部で動作しますか?それはnullではありませんか? – akashivskyy

答えて

0

nibファイルがinitではなくinitWithCoderメソッドを呼び出していました。

0

あなたは-initメソッドを使用しないでください。ときには呼び出されていないこともあります。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // do something 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // do something 
} 
+4

これを正当化できますか? View Controllerを初期化メソッドで初期化することに何も問題はありません。コントローラーのビューがその時点でロードされていないだけなので、ビューに依存する初期化は '-viewDidLoad'まで延期されるべきです。 – Caleb

+0

はい、viewDidLoadを使用すると動作することがわかりますが、それがベストプラクティスではないと思います。また、initはこの状況で呼び出されています – James

+0

これは私には分かりませんでしたが、私はグローバルテスト文字列の値を設定しても、initの外部でその値にアクセスすることはできません。非常に奇妙なことが起こっています – James

1

このビューコントローラはMainWindow.xibファイル(またはプロジェクトのメイン.xibが呼び出されているもの)にありますか?もしそうなら、そのファイルが読み込まれたときにアプリケーションデリゲートが作成される可能性が高く、ビューコントローラが作成されたときにアプリデリゲートがおそらくnilである可能性があります。あなたのアプリケーションデリゲートがこのビューコントローラへの参照を持っている場合は、それ自体をビューコントローラのデリゲートとして-applicationDidFinishLoadin:withOptions:に設定するか、.xibファイルのビューコントローラの-delegateコンセントにアプリケーションデリゲートを接続します。

+0

MainWindow.xibではありません。私はそれの中にタブバーを持っている別のtabBarViewControllerクラスを作成しました。この特定のviewcontrollerの別のUIViewcontrollerもあります – James

+0

それにもかかわらず、アプリケーションの起動時に問題のView Controllerが作成されている場合、App Delegateはまだ設定されていない可能性があります。あなたがそれを割り当てようとしている行を壊した場合、実際にはアプリケーションデリゲートへの正当なポインタが得られますか? – Caleb

+0

ビューのコントローラは、その前のログイン画面でボタンが押されるまで作成されていません。そして、initメソッドでは、代理人への正当なポインタを取得し、その値にアクセスすることさえできます。しかし、initメソッドの終了後、私はもはやデリゲートにアクセスすることができません。 – James

関連する問題