为什么从textFieldShouldBeginEditing调用resignFirstResponder方法?

时间:2014-11-07 08:41:02

标签: ios swift uitextfield first-responder

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

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

为什么我会告诉应用程序resignFirstResponder,这是为了隐藏键盘/日期选择器(如在stackoverflow上的几个examplesnoobie 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?!?
}

2 个答案:

答案 0 :(得分:0)

您应该只撤销未受影响的文本字段:

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

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

答案 1 :(得分:0)

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

ResignFirstResponder不会隐藏日期选择器,因此"输入设备" (对于这个领域)仍然可用。

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