【问题标题】:The delegate pattern does not fire in the class where it is implemented委托模式不会在实现它的类中触发
【发布时间】:2020-12-01 22:49:49
【问题描述】:

有一个 TopMenuBar 类。这是主类(名为 - MainVC)中 tableViewCell 的菜单栏(collectionView)。

class TopMenuBar: UITableViewCell {
     public var delegate: TopMenuBarDelegate?
}

和协议:

protocol TopMenuBarDelegate {
     func didTapTopMenuCell(named: String)
}

在带有委托的 didSelectItemAt() 方法中,我调用了这个协议:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
     ///Relay to delegate about menu item selection
    let selectedItem = menuItems[indexPath.row + 1].description
    delegate?.didTapTopMenuCell(named: selectedItem)
}

此外,在主类 - MainVC 中,我订阅了协议 - TopMenuBarDelegate,添加了协议方法 - didTapTopMenuCell(),创建了 TopMenuBar 类的实例,并在 viewDidLoad 方法中为该协议分配了委托 - MainVC 类。

class MainVC: UIViewController, TopMenuBarDelegate {

   let topMenuBar = TopMenuBar()

   func didTapTopMenuCell(named: String) {
       print(named)
   }
   override func viewDidLoad() {
       super.viewDidLoad()
   topMenuBar.delegate = self
   }
}

为了测试功能,我只想打印我单击的单元格的名称。 结果,控制台中没有任何内容。

【问题讨论】:

  • TopMenuBar 是如何呈现在屏幕上的?您将委托注入到该类的同一实例中吗?
  • @PhillipMills 这是我的菜单栏的一个单独的 collectionview 类。在 MainVC 类中,它表示为 tableView 中的 headerView。作为表格中的菜单))
  • func collectionView(_ collectionView: UICollectionViewTopMenuBarMainVC 内吗?
  • TopMenuBar 内的@aheze 收集方法。
  • 嗯...你能确认这个方法确实被调用了吗?

标签: ios swift design-patterns delegates protocols


【解决方案1】:

你没有使用你的topMenuBar

let topMenuBar = TopMenuBar()

viewDidLoad 中,您执行topMenuBar.delegate = self,但您设置为标题的实际 视图是这样的:

guard let cell = tableView.dequeueReusableCell(withIdentifier: TopMenuBar.cellIdentifier()) as? TopMenuBar else {
    return nil
}

在这里,您正在创建一个新的TopMenuBar (cell)!你根本没有使用let topMenuBar = TopMenuBar()

你需要做的是摆脱:

let topMenuBar = TopMenuBar()

override func viewDidLoad() {
    super.viewDidLoad()
    topMenuBar.delegate = self
}

改为设置cell的委托。

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: TopMenuBar.cellIdentifier()) as? TopMenuBar else {
        return nil
    }

    cell.delegate = self /// assign here!
    return cell
}

【讨论】:

  • 这是一个超级酷的决定!!!我在这里做的不同 - topMenuBar.delegate = self.我还不明白 - cell.delegate = self.我需要弄清楚它是如何在引擎盖下工作的。非常感谢!!!
  • @PAULMAX 您创建了 2 个不同的 TopMenuBar 示例,您将委托分配给第一个并将第二个称为单元格。这就是为什么什么都没有发生的原因。
【解决方案2】:

与其将topMenuBar.delegate = self 放在viewDidLoad 中,不如在MainVC 中初始化collectionView 时尝试将其放在cellForItemAt 中。

【讨论】:

  • Collectionview 是 MainVC 中 tableView 中的一个单元格(标题)。我应该用这种方法吗? 'code' func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
猜你喜欢
  • 2019-10-07
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多