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

您可以设置textFields为属性并合成它们。您将需要在您的应用程序中使用的尽可能多的属性。

您可以拥有 @synthesise myTextField0, myTextField1, myTextField2;三个文本字段。只需将UITextField您正在使用的每个属性分配给这些属性,同时声明它们。

当您想辞退他们时,只需使用[self.myTextField0 resignFirstResponder]attextFieldDidEndEditing或您想要辞退他们的任何功能。您也可以将其用于其他文本字段。这是处理多个文本字段的方法

一般来说,你可以跳过所有这些步骤,textField.returnKeyType = UIReturnKeyDone; 如果你有DONE返回键,你可以直接去方法

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

或者您可以使用tags标记某些文本字段,然后辞去特定的文本字段。

于 2011-07-14T05:28:56.237 回答
0

你可以检查一下isFirstResponder。在任何时候,只有一个UIResponderUITextField在你的情况下)可以是firstResonder.

于 2011-07-14T05:32:48.220 回答
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 重新分配FirstResponder 。

于 2015-05-13T05:39:15.163 回答
0

我在从多个 TextField 中为选定的 UITextField辞职第一响应者时遇到问题。经过这么多不同的解决方案,我发现这对我有用。

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

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

        if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder] && [textField isEqual:_selectedLabel] ) {
            [textField resignFirstResponder];
        }
    }
}
于 2017-10-06T10:00:07.847 回答
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 中,您将拥有:

如果您的 TextFields 现在还没有设置标签:

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 回答
-1

您可以使用endEditing而不是resignFirstResponder

尝试这个

[self.view EndEditing:YES]
于 2013-09-28T06:05:53.893 回答