Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何避免代理调用的痕迹_Ios_Swift_Swift Protocols - Fatal编程技术网

Ios 如何避免代理调用的痕迹

Ios 如何避免代理调用的痕迹,ios,swift,swift-protocols,Ios,Swift,Swift Protocols,我有一个UIViewController,它有一个UICollectionView,在里面我有一个ListSectionController类,它控制一个UICollectionViewCell,在这个单元格里我有一个UIView子类 当按下按钮时,我需要从UIViewController调用一个方法。目前,我有一系列委托方法,因为它可以返回到视图控制器,如下所示: class MyView { // delegate is the cell that the view is conta

我有一个
UIViewController
,它有一个
UICollectionView
,在里面我有一个
ListSectionController
类,它控制一个
UICollectionViewCell
,在这个单元格里我有一个
UIView
子类

当按下按钮时,我需要从
UIViewController
调用一个方法。目前,我有一系列委托方法,因为它可以返回到视图控制器,如下所示:

class MyView {
    // delegate is the cell that the view is contained in

    @IBAction func buttonPress() {
        delegate?.myDelegateMethod()
    }
}

extension MyCell : MyViewDelegate {
    // The delegate is the section controller

    func myDelegateMethod() {
        delegate?.myDelegateMethod()
    }
}

... etc

这看起来像是大量的代码重复和空间浪费。我如何改进这一点?

您可以通过一种通用的、类型安全的方式,直接从响应者链到达任何父视图或视图控制器:

extension UIResponder {
    func firstParent<T: UIResponder>(ofType type: T.Type ) -> T? {
        return next as? T ?? next.flatMap { $0.firstParent(ofType: type) }
    }
}
当按下按钮时,我需要从UIViewController调用一个方法

一种方法:为按钮提供一个无目标操作,并在UIViewController中实现该操作方法。消息将自动到达

例如,我们给按钮一个无目标操作:

    class Dummy {
        @objc func buttonPressed(_:Any) {}
    }
    button.addTarget(nil,
        action: #selector(Dummy.buttonPressed),
        for: .touchUpInside)
在视图控制器中,我们有:

    @objc func buttonPressed(_ sender: Any) {
这将起作用,因为视图控制器位于按钮的响应器链的上方。这正是无目标行动的目的



另一种方法是使用NotificationCenter和Notification。我认为这在这种情况下也是非常合适的。

我已经多次遇到这种情况,因此我想首先声明:

“如果您的单元格(以及其中的视图)负责执行一项且仅执行一项操作(可能是其中的表单按钮)”,则可以使用
didSelectItemAtIndexPath
“。通过使用
UIImageView
设计视图。这种方法存在一些用户体验问题,例如,突出显示,除此之外,其他所有问题也可以通过委托处理


如果情况并非如此,并且您的单元格正在执行多个动作,请给出最佳方法。

MyView的代理不必是单元格,它可以是view controller。只需将它一直传递到“创建单元时的视图”中,这就是正确分离实现的工作方式。然而,现在我几乎所有的东西都会使用闭包(回调块)。你可以使用通知中心作为委托的替代方案。这绝对不是一个好的解决方案,因为它破坏了封装。@Sulthan我们不得不同意不同意这一点。哇,以前从来没有听说过无目标操作!
    @objc func buttonPressed(_ sender: Any) {