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

The delegate pattern does not fire in the class where it is implemented

有一个 TopMenuBar class。这是主 class(名为 - 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)
}

此外,在主要 class - MainVC 中,我订阅了协议 - TopMenuBarDelegate,添加了一个协议方法 - didTapTopMenuCell(),创建了 TopMenuBar class 的实例,并在 viewDidLoad 中方法我为这个协议分配了一个委托 - MainVC class.

class MainVC: UIViewController, TopMenuBarDelegate {

   let topMenuBar = TopMenuBar()

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

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

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

您没有使用 topMenuBar

let topMenuBar = TopMenuBar()

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

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
}