1

リモートサーバーからデータを検索するために使用されるモーダルウィンドウがあります。ウィンドウのナビゲーションバーのtitleControlとしてUITextFieldがあり、ウィンドウを埋めるテーブルビューがあります(結果が明らかに表示されます)。ここで私がしたいことは、ユーザーがテーブルビューをスクロールしたときに、すぐにテキストフィールドのフォーカスを失い (ファーストレスポンダを辞任する)、キーボードが消え、ユーザーがテーブルビューをスクロールする余地が増えることです (残ったギャップを埋めるために下に伸びます)キーボードで)。UISearchDisplayController (またはそれが呼ばれるもの) を使用する場合と基本的に同じ機能です。

だから私はテーブルビューのスクロールイベントを検出するためのこのコードを持っています:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [searchField resignFirstResponder];
}

これはうまくいきます。ただし、問題は、ユーザーがテーブルをスクロールしてテキストフィールドがフォーカスを失うと、もう一度タップしてもフォーカスを戻すことができないことです。したがって、基本的に一度呼び出すと[resignFirstResponser]、キーボードを元に戻してテキストフィールドの値を編集することはできなくなります。誰でも理由がわかりますか?[becomeFirstResponder]どこかでフィールドを明示的に呼び出す必要がありますか? フィールドがタップされたときに自動的に処理されると思ったからですか?

また[becomeFirstResponder]、モーダルウィンドウが最初に呼び出されたときにテキストフィールドを呼び出しているため、フィールドは事前にフォーカスされています。それと何か関係があるのでしょうか?

誰かが望むならもっと多くのコードを投稿できますが、私はテキストフィールドで異常なことをしているとは思いません。

助けてくれてありがとう!

4

3 に答える 3

1

searchFieldのデリゲートを設定しましたか?私も同じ問題を抱えていました。モデルビューをポップアップし、テキストフィールドをviewDidLoad内の最初のレスポンダーになるように設定します。すべてが初めてうまく機能します。しかし、モーダルビューコントローラを閉じてから再度開きます。テキストフィールドにフォーカスできなくなりました。

UITextFieldDelegateのメソッドと関係があることがわかりました。メソッドの実装を削除したら

– textFieldShouldEndEditing:
– textFieldDidEndEditing:

すべてがうまく機能します。でも理由はわかりません

于 2011-08-07T07:21:12.443 に答える
1

resignFirstResponderをスクロールするたびに呼び出される関数からを呼び出していますUIScrollview。したがって、表示されません。uitextview がフォーカスから外れたら、resign を呼び出す必要があります。

次のことができます。そのハック:

  1. UITextField に注目するたびに、スクロール ビューをオーバーレイする非表示のボタンを作成します。
  2. ボタン プレス イベントをキャプチャし、ファーストレスポンダーを辞任する
  3. uitextfield が最初のレスポンダーになるたびに、ボタンを作成します

このようにして、バグを取り除きます。つまり、 でメソッドを呼び出しscrollViewWillBeginDraggingます。他のオプションはviewDidAppear、のメソッドを上書きすることuiTextFieldです。

または、テキストフィールドを別のコンテナに配置し、どのスクロールビューがメッセージを送信したかを確認して scrollViewWillBeginDragging を処理することもできます。

于 2011-07-23T21:01:26.417 に答える