什么是最好的代表或获得superview?

时间:2017-06-04 15:31:02

标签: ios swift delegates protocols

任何人都可以帮我理解使用委托/协议或获取superview,因为我知道快速使用面向代码的协议但是对于抓取父视图或控制器我们仍然可以使用获取超级视图

获取超级视图示例:

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
  }
}

使用委托示例:

protocol SomeDelegate {
  func didClick()
}

class Child {
  var delegate: SomeDelegate?
}

使用代表或获取superview的优点和缺点是什么?

parentView的示例:

class Cell {

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

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

委托示例:

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()
  }
}

1 个答案:

答案 0 :(得分:0)

代表是首选,而不是超级视图。以下是一些原因

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