15

私のアプリケーションには、検索バーを含むモーダル ビュー コントローラーがあります。ビューが表示されたら、検索バーにフォーカスを合わせたいです。で試してみ[self.searchBar becomeFirstResponder]ましたviewDidLoadが、うまくいきませんでした。後でそれを入れたところ、viewDidAppearうまくいきました。ただし、この回避策を使用すると、目に見える遅延が発生します。(ビューが完全に表示された後、キーボードが表示され始めました)

私は両方を確保することができ、viewDidAppear呼び出さviewDidLoadれました。

ビューが表示された状態で検索バーを即座にフォーカスしたい場合はどうすればよいですか?

(ストーリーボードを使用しています)

答えに従って、コードを に入れようとしましたviewWillLoadが、それでもうまくいきませんでした。(in viewWillLoad,self.searchBar.windowはゼロ)

4

7 に答える 7

6

ビューがまだビュー階層に追加されていないため、viewDidLoad では機能しない可能性があります。しかし、Apple のドキュメントによると、becomeFirstResponder は UIWindow にアタッチされたオブジェクトでのみ呼び出す必要があります。

However, you should only call it on that view if it is part of a view hierarchy. 
If the view’s window property holds a UIWindow object, it has been installed 
in a view hierarchy; if it returns nil, the view is detached from any hierarchy.

したがって、必要な動作を実現するための最良の場所は、呼び出しをviewWillAppearメソッドに配置することだと思います。

アップデート。

したがって、viewWillAppearコントローラーのビューではまだUIWindowにアタッチされていません...ビューがビュー階層に追加されることを通知するだけです

少し難しいかもしれませんが、viewWillAppear で少し遅延させることができます。

 - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    double delayInSeconds = 0.05;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^{ 
        make first responder here
    });
 }

しかし、私はより良い解決策があるはずだと信じています

于 2013-03-18T09:03:42.630 に答える
4

すべての IBOutlet オブジェクトは viewDidLoad にロードされます。viewDidLoad でメソッドを呼び出している場合、オブジェクトがロードされる前に何もできないため、そのアクションは実行されません。

-(void)viewWillAppear:(BOOL)animated{
//write here
} 

その後、正常に動作します。

于 2013-03-18T09:00:52.643 に答える
2

テキスト フィールド/ビューのファーストレスポンダーの作成は、ビューが読み込まれて表示されるときに行われるすべての UIViewController アニメーションの後に行う必要があります。したがって、最良の場所はviewDidAppearです。

于 2013-03-18T10:42:16.677 に答える
1

viewWillAppearの代わりに書いてくださいviewDidAppear/viewDidLoad

viewWillAppearメソッドは View の時点で呼び出されます ( in process ) が表示されますので、詳細についてviewWillAppearは、この公式ドキュメントを参照してください。

- (void)viewWillAppear:(BOOL)animated
{
    [self.searchBar becomeFirstResponder];
    [super viewWillAppear:animated];
}
于 2013-03-18T08:59:59.863 に答える
1

少し古いスレッドであることはわかっていますが、このコードを追加するときにキーボードの問題に直面している人を助けることができると思います.

viewWillDisappear で textfield デリゲートを nil に設定することを忘れないでください。そうしないと、キーボードを閉じずにビュー コントローラーをポップ/閉じると、キーボードが再び表示されなくなります。

于 2016-08-17T02:47:18.960 に答える