【问题标题】:Why call method to resignFirstResponder from textFieldShouldBeginEditing?为什么从 textFieldShouldBeginEditing 调用 resignFirstResponder 方法?
【发布时间】:2014-11-07 17:03:54
【问题描述】:

我试图了解一般的委托方法,特别是如何解除从文本字段中弹出的 UIDatePicker。

根据文档, textFeildShouldBeginEditing 返回 true '如果应该启动编辑会话;否则为 false 以禁止编辑。'

然后我为什么要告诉应用程序 resignFirstResponder,这意味着隐藏键盘/日期选择器(如 stackoverflow 上的几个 examples 和 noobie tutorials)?

我不明白的是:如果它应该开始编辑,为什么还要隐藏输入设备?显然,我误解了一个或两个概念。

func resign() {        
      dobTextField.resignFirstResponder()
      nameTextField.resignFirstResponder()
      println("resign gets printed, but the date picker is still visible!?!")
}

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {  
    if (textField === dobTextField) {
    resign()          // but should begin editing, oder?!?
}

【问题讨论】:

  • 这取决于,通常你不应该从ShouldBegin辞职,如果用户按下键盘的return key,还有另一个代表shouldreturn会被调用,你通常应该在那里辞职。现在有时用户不按返回键并直接跳转到另一个文本字段,这会将响应者更改为下一个文本字段。在您的情况下,您正在尝试退出所有可能有键盘的文本字段,但它应该排除当前的文本字段,而不是全部。

标签: ios swift uitextfield first-responder


【解决方案1】:

在您引用的示例中,textField 用于显示日期。当用户选择此字段时,应用设计者希望 UIDatePicker 显示在而不是键盘上。因此他们调用 resignFirstResponder 来隐藏键盘。同时,它们显示日期选择器。

ResignFirstResponder 不会隐藏日期选择器,因此“输入设备”(用于该字段)仍然可用。

另外,请注意,在一种情况下,开发人员使用了 textFieldShouldBeginEditing,并返回 false,因为他们提供了日期选择器。在另一种情况下,开发人员使用 textFieldDidBeginEditing(没有返回值)。

【讨论】:

  • 谢谢!我看到了其中的逻辑,以及另一个 IBAction 调用中使用的 self.dismissViewControllerAnimated 方法。
【解决方案2】:

您应该只辞职不受影响的文本字段:

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {  
    if textField == dobTextField {
        nameTextField.resignFirstResponder()
    } else if textField == nameTextField {
        dobTextField.resignFirstResponder()
    } 
    return true
}

这样,您仅在当前不应编辑的文本字段上重新调整第一响应者。如果由于某种原因您不小心分配了 2 个文本字段(或更多),导致与多个键盘/日期选择器等发生冲突,这会有所帮助。

【讨论】:

  • 谢谢 - 这也是有道理的。
猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多