为多个UITextField重新启动First Responder

时间:2011-07-14 05:21:47

标签: iphone ios uitextfield resignfirstresponder

有一个应用程序,我动态生成多个UITextFields。我想在未选择UITextFields的情况下辞职第一响应者(在UITextField之外触摸)。我怎么知道UITextField我必须辞职的第一响应者?请指出除“标签”概念之外的任何其他方式,因为我已尝试过。请建议正确的方向。提前致谢。

13 个答案:

答案 0 :(得分:49)

别打电话给resignFirstResponder;致电endEditing:

在视图层次结构中文本字段上方的任何视图上调用endEditing:。它会找到第一个响应者并要求它辞职。使用endEditing:YES强制它或endEditing:NO让文本字段的代表决定是否应该结束编辑(如果您正在验证输入,则非常有用)。

答案 1 :(得分:8)

**[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view

答案 2 :(得分: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.
}

答案 3 :(得分:3)

您可以实现委托方法

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

你可以使用currentTextField = textField;

在另一个委托方法

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

你可以做currentTextField = nil;

然后您可以重新签名currentTextField ....

答案 4 :(得分:3)

你可以这样试试:

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

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

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

我没试过,但似乎是一个很好的解决方案

答案 5 :(得分:1)

最通用的方式,也是唯一一个在UITableViewController中为我工作的方法是在响应链中发送操作并等待正确的对象接收操作:

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

在iOS8中测试

答案 6 :(得分:0)

您可以将textFields设置为属性并进行综合。您需要在应用中使用尽可能多的属性。

您可以为三个textField提供@synthesise myTextField0, myTextField1, myTextField2;。只需将您正在使用的每个UITextField分配给这些属性,同时声明它们。

当你想要辞职时,只需在[self.myTextField0 resignFirstResponder]使用textFieldDidEndEditing,或者在想要辞职的任何功能上使用textField.returnKeyType = UIReturnKeyDone; 。你也可以将它用于其他textFields。这是处理多个textFields的方法

一般情况下,如果您使用DONE返回键,则可以使用 - (BOOL) textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return 1; } 跳过所有这些步骤,您只需转到方法

tags

或者您可以使用{{1}}标记某些textFields然后重新签名。

答案 7 :(得分:0)

您可以查看isFirstResponder。 在任何时间点,只有UIResponder(在您的情况下为UITextField)可以是firstResonder

答案 8 :(得分: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];
               }
           }
    }

答案 9 :(得分:0)

使用[self.view endEditing:YES]; resignFirstResponder获取当前活动的UITextField。

答案 10 :(得分: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.

答案 11 :(得分:0)

我在多个TextField中为所选UITextField的 Resigning first responder 时遇到问题。 经过这么多不同的解决方案后,我发现这对我来说是正常工作

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

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

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

答案 12 :(得分:-1)

您可以使用endEditing代替resignFirstResponder

试试这个

[self.view EndEditing:YES]