ios - 最好的委托(delegate)或获得监督是什么?

标签 ios swift delegates protocols

任何人都可以帮助我给出使用面向委托(delegate)/协议(protocol)或获取 super View 的理由,因为我知道在代码上快速使用面向协议(protocol),但为了获取父 View 或 Controller ,我们仍然可以使用像

获取 super View 示例:

extension UIView {

  var parentViewController: UIViewController? {
    var parentResponder: UIResponder? = self
    while parentResponder != nil {
        parentResponder = parentResponder!.next
        if let viewController = parentResponder as? UIViewController {
            return viewController
        }
    }
    return nil
  }
}

使用委托(delegate)示例:

protocol SomeDelegate {
  func didClick()
}

class Child {
  var delegate: SomeDelegate?
}

使用委托(delegate)或获取 super View 有何优点和缺点?

父 View 示例:

class Cell {

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    self.parentViewController.view.makeToast("Something !")
  }
}

委托(delegate)示例:

class Parent: SomeDelegate {
  func didClick() {
    self.view.makeToast("Something !")
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableview.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? Cell
    cell.delegate = self

    return cell
  }
}

class Cell {
  var label: UILabel
  var delegate: SomeDelegate?

  func configure() {
    label.addGestureRecognizer(UILongPressGestureRecognizer(
        target: self,
        action: #selector(copyAction(_:))
    ))
  }

  @objc private func copyAction(_ sender: UILongPressGestureRecognizer) {
    guard let delegate = self.delegate else {
      return
    }

    delegate.didClick()
  }
}

最佳答案

首选委托(delegate),而不是 super View 。以下是一些原因

  1. 添加到堆栈中的 View 在添加后并不总是保留在内存中。特别是当没有维护强引用时(当从 XIB 或 SB 添加 View 时,这会有所不同)。因此,在这种情况下,调用 super View 有时可能会因在某个随机实例上发送的无法识别的选择器而崩溃。
  2. 人们可以创建一个 View ,但永远不会添加到另一个 View 。 ex 为了删除,您可能只评论 addsubview 行,保留其他代码不变。此时 super View 也为零。
  3. 在 uicontrols 下使用自定义 View 以及自己的可重用 View 堆栈(如 Collectionview、TableView 等)会在运行时更改 super View 。因此并不总是保证调用相同的 super View 实例。

关于ios - 最好的委托(delegate)或获得监督是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44355714/

相关文章:

ios - 使用 AFNetworking 从多个资源中获取数据并返回

ios - SKMaps,如何在收到来自 iOS 的内存警告时清除 map 数据的内存缓存?

ios - 检索子节点数据

C# GC 委托(delegate)?

ios - 选择器未触发委托(delegate)方法

ios - 在 PFUser 注册后创建一个 PFObject 和 PFRelation

iOS 9 扩展状态栏错误?

ios - 如何使某个功能可以在特定平台上访问?

ios - 委托(delegate)中的可选返回

ios - TableView 单元格中的 UILabel 和 UISwitch