14

UITextFields複数を動的に生成しているアプリケーションがあります。が選択されていないときはいつでもファーストレスポンダーを辞任したいUITextFields( の外側に触れるUITextField)。UITextFieldファーストレスポンダーを辞任しなければならないものをどのように知ることができますか? 「タグ」の概念を超えた他の方法を指定してください。私はそれを試しました。正しい方向を提案してください。前もって感謝します。

4

13 に答える 13

51

電話しないでくださいresignFirstResponder。コールendEditing:

endEditing:ビュー階層のテキスト フィールドの上にある任意のビューを呼び出します。最初の応答者を見つけて、辞任するように依頼します。endEditing:YES強制的に編集するか、テキスト フィールドのデリゲートに編集を終了するかどうかを決定させるために使用しendEditing:NOます (入力を検証する場合に便利です)。

于 2012-02-10T05:29:47.997 に答える
8
**[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view
于 2012-09-13T07:39:52.607 に答える
3

このコードを使用して実装します

-(BOOL)textFieldShouldReturn:(UITextField*)textField;
{
  NSInteger nextTag = textField.tag + 1;
  // Try to find next responder
  UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
  if (nextResponder) {
    // Found next responder, so set it.
    [nextResponder becomeFirstResponder];
  } else {
    // Not found, so remove keyboard.
    [textField resignFirstResponder];
  }
  return NO; // We do not want UITextField to insert line-breaks.
}
于 2011-07-14T05:31:21.713 に答える
3

デリゲートメソッドを実装できます

- (void)textFieldDidBeginEditing:(UITextField *)textField; 

currentTextField = textField; を取ることができるという点で。

別のデリゲート メソッドで

- (BOOL)textFieldShouldReturn:(UITextField *)textField; 

currentTextField = nil; を実行できます。

その後、 currentTextField を辞任できます....

于 2011-07-14T05:31:40.870 に答える
3

次のように試すことができます。

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event { 

    for (id textField in self.view.subviews) {

        if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder]) {
            [textField resignFirstResponder];
        }
    }
} 

私はそれを試しませんでしたが、それは良い解決策のようです

于 2011-09-01T09:49:43.363 に答える
1

最も一般的な方法であり、私のために機能した唯一の方法UITableViewControllerは、アクションをレスポンダーチェーンに送信し、適切なオブジェクトがアクションを受信するのを待つことでした:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

iOS8でテスト済み

于 2015-07-03T11:24:26.987 に答える
0

ところで..私はこれを別の方法で行いました..プログラミングのチャンプ技術はあまり良くありませんが、私の仕事を解決するのに十分です!!

for(UIView *v in self.view.subviews)
    {
        if(([v isMemberOfClass:[UITextField class]]==YES) && !(CGRectContainsPoint(v.frame,[[touches anyObject] locationInView:self.View)))
           {
               v.userInteractionEnabled=NO;
               if([v isEditing])
               {
               [v resignFirstResponder];
               }
           }
    }
于 2011-07-15T09:56:16.250 に答える
0

[self.view endEditing:YES];現在アクティブな UITextField の ResignFirstResponder に使用します。

于 2015-05-13T05:39:15.163 に答える
0

プロパティとして設定textFieldsし、合成することができます。アプリで使用しているのと同じ数のプロパティが必要になります。

@synthesise myTextField0, myTextField1, myTextField2;3 つの textFieldsを持つことができます 。UITextFieldそれらを宣言しながら、使用しているそれぞれをこれらのプロパティに割り当てるだけです。

そして、それらを辞任したいときは、[self.myTextField0 resignFirstResponder]attextFieldDidEndEditingまたは辞任したい関数を使用してください。また、これを他の textFields にも使用できます。これは、複数の textFields を処理する方法です

通常、これらの手順はすべてスキップできます。リターン キーtextField.returnKeyType = UIReturnKeyDone; があれば、メソッドに移動できます。DONE

 - (BOOL) textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return 1;
}

tagsまたは、特定の textField にタグを付けてから、特定のものを辞任するために使用できます。

于 2011-07-14T05:28:56.237 に答える
0

で確認できますisFirstResponder。いつでもUIResponderUITextFieldあなたの場合は)1つだけができますfirstResonder

于 2011-07-14T05:32:48.220 に答える
0

これは、Xamarin.iOS/Monotouch でうまくいきました。キーボード ボタンを Next に変更し、コントロールを次の UITextField に渡し、最後の UITextField の後にキーボードを非表示にします。

private void SetShouldReturnDelegates(IEnumerable<UIView> subViewsToScout )
{
  foreach (var item in subViewsToScout.Where(item => item.GetType() == typeof (UITextField)))
  {
    (item as UITextField).ReturnKeyType = UIReturnKeyType.Next;
    (item as UITextField).ShouldReturn += (textField) =>
    {
        nint nextTag = textField.Tag + 1;
        var nextResponder = textField.Superview.ViewWithTag(nextTag);
        if (null != nextResponder)
            nextResponder.BecomeFirstResponder();
        else
            textField.Superview.EndEditing(true); 
            //You could also use textField.ResignFirstResponder(); but the above line makes some users happier (e.g. benzado)

        return false; // We do not want UITextField to insert line-breaks.
    };
  }
}

ViewDidLoad内には、次のものがあります。

TextField にタグが設定されていない場合:

txtField1.Tag = 0;
txtField2.Tag = 1;
txtField3.Tag = 2;
//...

そして電話だけ

SetShouldReturnDelegates(yourViewWithTxtFields.Subviews.ToList());
//If you are not sure of which view contains your fields you can also call it in a safer way:
SetShouldReturnDelegates(txtField1.Superview.Subviews.ToList());
//You can also reuse the same method with different containerViews in case your UITextField are under different views.
于 2016-02-16T16:24:35.807 に答える