委托模式不会在实现它的类中触发

保罗麦克斯

有一个 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.

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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章