我试图理解一般的委托方法,特别是如何解除从文本字段中弹出的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?!?
}
答案 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(没有返回值)。