【问题标题】:Resigning First Responder for multiple UITextFields为多个 UITextFields 辞职第一响应者
【发布时间】:2011-10-05 01:13:16
【问题描述】:

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

【问题讨论】:

标签: iphone ios uitextfield resignfirstresponder


【解决方案1】:

不要打电话给resignFirstResponder;致电endEditing:

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

【讨论】:

    【解决方案2】:
    **[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view
    

    【讨论】:

      【解决方案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.
      }
      

      【讨论】:

      • 感谢@Deepesh 的快速响应!!
      【解决方案4】:

      你可以实现委托方法

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

      因为你可以取 currentTextField = textField;

      在另一个委托方法中

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

      你可以做 currentTextField = nil;

      然后你可以辞职 currentTextField....

      【讨论】:

      • @Jignesh 感谢您快速简单的回复!是的,我已经完成了!
      【解决方案5】:

      你可以这样试试:

      - (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event { 
      
          for (id textField in self.view.subviews) {
      
              if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder]) {
                  [textField resignFirstResponder];
              }
          }
      } 
      

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

      【讨论】:

        【解决方案6】:

        UITableViewController 中最通用的方式也是唯一对我有用的方式是将动作发送到响应者链并等待正确的对象接收动作:

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

        在 iOS8 中测试

        【讨论】:

          【解决方案7】:

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

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

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

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

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

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

          【讨论】:

          • 感谢您的回复,但问题是动态生成 UITextField..所以无法知道会有多少? so as 也没能合成出什么东西……虽然做了不同的方法!!谢谢!!
          【解决方案8】:

          顺便说一句..我以不同的方式做到了这一点.. 看起来不是一个很好的编程冠军技术,但足以解决我的工作!!

          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】:

            您可以与isFirstResponder 联系。 在任何时间点,只有一个UIResponder(在您的情况下为UITextField)可以是firstResonder

            【讨论】:

            • 感谢您的建议!!我已经用其他方式完成了,但想知道你的完整程序..你能发布一段代码吗?提前致谢!
            【解决方案10】:

            使用[self.view endEditing:YES]; 为当前活动的 UITextField 重新签名FirstResponder。

            【讨论】:

              【解决方案11】:

              这在 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.
              

              【讨论】:

                【解决方案12】:

                我在 Resigning first responder 时遇到了问题,因为我从多个 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];
                        }
                    }
                }
                

                【讨论】:

                  【解决方案13】:

                  您可以使用endEditing 代替resignFirstResponder

                  试试这个

                  [self.view EndEditing:YES]
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多