委托 VS IBAction 处理事件 iOS

Delegates VS IBAction for handling events iOS

我是 swift 和 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
    }
} 

Delegate 是一种设计模式,可让您轻松自定义一个中心对象中多个对象的行为。

操作仅仅是用户交互。

无法用操作替换委托回调。例如,如果您有一个无法加载的 WebView,那么它如何使用操作通知您的对象? 在您的示例中,操作不能 return 属性,例如 shouldChangeCharactersInreplacementString。为此你需要一个代表。

阅读更多... Delegate pattern (Apple docs)

看看UITextViewDelegate。它会变得更容易理解。

正在回复编辑通知

func textViewShouldBeginEditing(UITextView)

询问委托人是否应在指定的文本视图中开始编辑。

func textViewDidBeginEditing(UITextView)

告诉代理指定文本视图的编辑已经开始。

func textViewShouldEndEditing(UITextView)

询问委托人是否应在指定的文本视图中停止编辑。

func textViewDidEndEditing(UITextView)

告诉代理指定文本视图的编辑已经结束。


响应文本更改

func textView(UITextView, shouldChangeTextIn: NSRange, replacementText: String)

询问代理是否应在文本视图中替换指定的文本。

func textViewDidChange(UITextView)

告诉代理指定文本视图中的文本或属性已被用户更改。


还有更多,但我不会再copy/paste你可以看到你自己了。您在这里看到的是您可以根据需要收听的内容。

如果需要,您可以收听并获得用户 开始 键入时的回调。或者您可以收听并获得用户结束编辑时的回调。

如何知道用户何时停止或开始使用 IBAction?!


一旦*您将自己设置为委托人(textViewInstance.delegate = self,您就可以选择获取这些回调中的任何一个。

*为了 100% 准确,您需要这样做,但也采用 UITextViewDelegate 协议,然后 符合 使用提到的委托回调