任何人都可以帮助我给出使用面向委托(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 。以下是一些原因
- 添加到堆栈中的 View 在添加后并不总是保留在内存中。特别是当没有维护强引用时(当从 XIB 或 SB 添加 View 时,这会有所不同)。因此,在这种情况下,调用 super View 有时可能会因在某个随机实例上发送的无法识别的选择器而崩溃。
- 人们可以创建一个 View ,但永远不会添加到另一个 View 。 ex 为了删除,您可能只评论 addsubview 行,保留其他代码不变。此时 super View 也为零。
- 在 uicontrols 下使用自定义 View 以及自己的可重用 View 堆栈(如 Collectionview、TableView 等)会在运行时更改 super View 。因此并不总是保证调用相同的 super View 实例。
关于ios - 最好的委托(delegate)或获得监督是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44355714/