2010-12-03 44 views
15

UIViewControllerサブクラスでは、次のメソッドがあります。UIViewController:viewWillAppearが呼び出され、viewDidAppearは呼び出されません。

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // do something 
    myTextField.text = @"Default"; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // do something 
    [myTextField selectAll:self]; 
    [myTextField becomeFirstResponder]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad];  
    // do something 
    myTextField.delegate = self; 
} 

NIBはInterface Builderを使用して作成されています。対応するビューコントローラオブジェクトは、pushViewControllerを通じてナビゲーションコントローラによってプッシュされます。

意図的な振る舞いは、テキストフィールドにデフォルトのテキストエントリを表示し、テキスト全体を選択し、テキストフィールドを最初のレスポンダとして設定することです。 [編集:最初のレスポンダーを作るすべてのを選択することは、選択が消えてしまうので意味がありません。それでも、メソッドが次のように動作する理由はわかりません。]

ただし、viewDidLoadおよびviewWillAppearメソッドが呼び出されている間はメソッドviewDidAppearは呼び出されません。なぜ誰に教えてもらえますか?ウェブ上で見つけたほとんどの質問は、viewWillAppear/viewDidAppearの両方で処理されています。私はまた、サブビューやプログラムで作成されたビューでは、これらのメソッドは呼び出されないことを理解しました。これは適用されませんし、なぜ私はこれらの "ライフサイクル"メソッドの1つが誘発され、もう1つは誘発されないのだろうかと思います。

いいですか?ありがとう!

答えて

0

viewDidAppear:への電話は、あなたがそうでないと言っているカスタムをしていない限り、常にviewWillAppear:に従うべきです。私はなぜそれが動作しないのか分かりませんが、ここにいくつかのアイデアがあります:

UITextFieldDelegateの代理人メソッドの中で何か変なことをしていることがありますか?それはviewDidAppear:が呼び出されることに影響することはほとんどありませんが、それが原因である可能性があります。

ビューをプッシュする前に、たくさんのものをメモリにロードしましたか? viewWillAppear:viewDidAppear:の間でメモリ警告が発生した場合、どうなるか分かりません。

クリーンを実行しようとしましたか?時にはそれが助けになることがあります。

これらのような場合には、私は通常、新しいクラスを作成し、機能を1つずつ紹介して、そのように動作するかどうかを確認します。新しいナビゲーションベースのプロジェクトでコードを試しました。ここでは、テキストフィールドにコンセントを付けて新しいUIViewControllerを追加しました。それから私は質問からコードを貼り付け、期待通りに機能しました。

+0

メモリの問題はありません。少なくともdidReceiveMemoryWarningは呼び出されません。きれいなすべての目標は助けになりませんでした。だから私はあなたの助言に従って、私は段階的に新しいプロジェクトにクラスをコピーしました。そして、それは動作します。 : - /私は元のクラスでオーバーライドするすべてのメソッドを追加しました。どちらの場合も、ビューはnavControllerのpushViewControllerによって表示されます。違いだけ:テストプロジェクトには1つのnavcontrollerがあり、私のプロジェクトには3つあります(rootcontrollerはtabbarcontroller) –

+0

@sven - ナビゲーションバーのタイトルビューを変更したいと思います。 viewWillAppearがトリガされると、ビューがナビゲーションバーにまだプッシュされていないようです。 – OmniBus

16

この問題は私に起こりました:viewWillAppearが呼び出されましたが、viewDidAppearはありませんでした。

私は最終的に私は、私はそれが自分のviewDidAppearだ過負荷になり、それはすべてのタブ内のすべてのVCを投げた[super viewDidAppear:animated];

を忘れてしまったtabBarControllerを持っていたので、これがあったことを考え出しました!私の他のVC'sのためにその行を固定して戻してください。

これが誰かを助けることを願っています!

+0

これは私のSwiftプロジェクトにおける私にとってはまさにこのケースでした。ありがとう! –

0

私は同じ問題を抱えていました。

viewDidAppearをコピーして貼り付けてviewWillAppearを作成しましたが、super.viewDidAppear()コールを変更するのを忘れていました。これは、viewDidAppearの呼び出しを停止したようです。

あなたのコードのどこかで、スーパークラスへの呼び出しを見逃したり、うんざりしているように思えます。

0

親VCに子ビューコントローラをviewDidLoadまたはviewWillAppearに追加した可能性があります。子供の外見はviewDidAppearへの呼び出しを防ぎます。

これは夢中になります。これは私のコードのバグだったので、わかります。私は親VCではなく、このVCに子VCを追加するつもりでした。

関連する問題