我是iOS开发的新手。我目前正在努力理解为什么委托用于处理UI中发生的事件。
到目前为止,在我正在完成的教程中,我只做了以下代码段来处理UI事件:
@IBAction func fahrenheitFieldEditingChanged(_ textField: UITextField) {
if let text = textField.text, let value = Double(text) {
fahrenheitValue = Measurement(value: value, unit: .fahrenheit)
} else {
fahrenheitValue = nil
}
}
但是现在我正在处理的教程是让我使用委托来处理来自同一文本字段的另一个UI事件。为什么这样做?使用委托而不仅仅是编写动作来处理事件有什么意义?
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
let replacementTextHasDecimalSeparator = string.range(of: ".")
if existingTextHasDecimalSeparator != nil, replacementTextHasDecimalSeparator != nil {
return false
} else {
return true
}
}
答案 0 :(得分:3)
看看UITextViewDelegate
。它会变得更容易理解。
func textViewShouldBeginEditing(UITextView)
询问代表是否应在指定的文本视图中开始编辑。
func textViewDidBeginEditing(UITextView)
告诉代理人已经开始编辑指定的文本视图。
func textViewShouldEndEditing(UITextView)
询问代表是否应在指定的文本视图中停止编辑。
func textViewDidEndEditing(UITextView)
告诉委托编辑指定的文本视图已经结束。
func textView(UITextView, shouldChangeTextIn: NSRange, replacementText: String)
询问代表是否应在文本视图中替换指定的文本。
func textViewDidChange(UITextView)
告诉委托者用户更改了指定文本视图中的文本或属性。
还有更多,但我不会再复制/粘贴你可以看到自己了。你在这里看到的是你可以调整的东西。
如果您愿意,可以在用户开始输入时收听并获得回调。或者,当用户结束编辑时,您可以收听并获得回调。
如何确定用户何时停止使用IBAction
?
一旦*您将自己设置为委托(textViewInstance.delegate = self
,您就可以选择获取任何这些回调。
*为了100%准确,您需要这样做,但也采用UITextViewDelegate
协议,然后使用提到的委托回调符合
答案 1 :(得分:2)
Delegate是一种设计模式,允许您轻松自定义一个中心对象中多个对象的行为。
行动仅仅是用户互动。
无法用动作替换委托回调。例如,如果您的WebView
无法加载,那么它如何通过操作通知您的对象?
在您的示例中,操作无法返回shouldChangeCharactersIn
和replacementString
等属性。你需要一个代表。
了解更多...... Delegate pattern (Apple docs)