【问题标题】:Where are implemented methods of delegate protocols called?委托协议的实现方法在哪里调用?
【发布时间】:2020-01-04 17:15:24
【问题描述】:

我是 swift 和 OOP 编程的新手,我正在尝试在使用 UIKit 时理解委托模式。我想我理解移交一些类职责的概念:有一个(例如)textFieldUITextField 的实例,它在 ViewController 中实现了一些逻辑:

class ViewController: UIViewController {
  let textField = UITextField(frame: CGRect(...))
  override func viewDidLoad() {
    textField.contentVerticalAlignment = .center
    textField.borderStyle = .roundedRect
    textField.placeholder = "Help me to figure it out"

    textField.delegate = self // set the controller as a delegate

    self.view.addSubview(textField)
  }
}

还有一个 ViewController 的扩展,它实现了 UITextFieldDelegate 协议的方法:

extension ViewController: UITextFieldDelegate {
  func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
  }

  ... // other methods
}

在阅读教程时,我想到类似这样的逻辑必须在 UIKit 中的某个地方实现:

let allowEditing = delegate?.textFieldShouldBeginEditing() ?? true

但是我找不到这行代码所在的地方。我是否理解正确,这段代码的位置是什么?我搜索了文档和类实现,但没有找到。

【问题讨论】:

    标签: ios swift uikit delegation


    【解决方案1】:

    你没看错!

    您要查找的代码在UIKit 的私有部分内,您看不到它。所有实现都是私有的。

    注意这个方法是一个objective-c的可选方法,所以它会被这样调用(如果它是一个Swift代码):

    guard delegation?.textFieldShouldBeginEditing?() ?? true else { return }
    becomeFirstResponder()
    

    () 之前看到? 吗?

    请注意,UIKit 是用 Objective-c 编写的,如果您想深入研究这两种语言,应该考虑这两种语言之间的差异。

    【讨论】:

    • 我知道了,谢谢你的回答!请你告诉我在哪里可以阅读更多关于 UIKit 目标 c 实现和 Swift 之间连接的信息?现在我知道我看不到私有部分,但我想更多地了解它是如何在后台大致实现的(即 Swift 类如何连接到 Objective-c 类以及框架通常如何工作)。
    • 您应该搜索基本实现和语言特性。一旦你习惯了它们,你就可以猜到它们是如何实现的。接下来,您应该搜索最佳做法,看看是否有您之前猜测的更好、性能更高的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多