如何避免代理调用的痕迹

时间:2019-03-15 12:59:59

标签: ios swift swift-protocols

我有一个UIViewController,它有一个UICollectionView,里面有一个控制ListSectionController的{​​{1}}类,在那个单元格里,我有一个{{1 }}子类。

按下按钮时,我需要从UICollectionViewCell调用一个方法。目前,我有一些委托方法,因为它可以正常工作,就像这样回到视图控制器:

UIView

这似乎是很多代码重复,并且有点浪费空间。我该如何改善呢?

3 个答案:

答案 0 :(得分:1)

  

按下按钮时,我需要从UIViewController调用方法

一种方法:为按钮提供 nil-targeted动作,并在UIViewController中实现action方法。该消息将自动到达。

例如,我们为按钮指定了零目标操作:

    class Dummy {
        @objc func buttonPressed(_:Any) {}
    }
    button.addTarget(nil,
        action: #selector(Dummy.buttonPressed),
        for: .touchUpInside)

在视图控制器中,我们有:

    @objc func buttonPressed(_ sender: Any) {

这将起作用,因为视图控制器位于按钮的响应者链上。这正是针对零目标的行为。


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

答案 1 :(得分:0)

您可以使用通用的安全输入方式将响应者链直接延伸到任何父视图或视图控制器:

HTTP Status 500 - 
org.springframework.transaction.CannotCreateTransactionException: 
Could not open Hibernate Session for transaction; nested exception 
is net.sf.hibernate.exception.GenericJDBCException: 
Unable to acquire JDBC Connection
extension UIResponder {
    func firstParent<T: UIResponder>(ofType type: T.Type ) -> T? {
        return next as? T ?? next.flatMap { $0.firstParent(ofType: type) }
    }
}

答案 2 :(得分:0)

我已经多次遇到这种情况,因此我想先说一下:

“如果您的单元格(及其内部的视图)仅负责执行一项操作(可能是其中的表单按钮)”,则可以使用didSelectItemAtIndexPath”。通过使用{ {1}}。这种方法存在一些UX问题,例如,高亮显示,除此以外的所有问题都可以由委托处理。

如果不是这种情况,并且您的单元正在执行多个操作,则Mat的答案将提供最佳方法。