委托模式不会在实现它的 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
}
有一个 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
}