自定义委托始终为零
Posted
技术标签:
【中文标题】自定义委托始终为零【英文标题】:Custom delegate alwayse nil 【发布时间】:2017-02-27 13:18:06 【问题描述】:我完全按照tutorial 创建了一个自定义委托。
我创建委托
protocol UserTableViewDelegate: class
func helpClicked()
然后上课HelpTableViewCell
弱 var 委托:UserTableViewDelegate?
@IBAction func helpButtonClicked(_ sender: UIButton)
delegate?.helpClicked()
在课堂UserTableViewController
我符合委托UserTableViewDelegate
然后
func helpClicked()
但是该函数永远不会被调用。 HelpTableViewCell
类中的委托变量始终为 nil,delegate?.helpClicked()
无效。
【问题讨论】:
你在哪里实现了协议? 你设置委托的地方,你没有设置委托,这就是为什么它没有被调用 在您的 UserTableViewController 中,您是否将 HelpTableViewCell 委托设置为 = self? 【参考方案1】:HelpTableViewCell 类中的delegate 变量始终为nil,并且delegate?.helpClicked() 无效。
那是因为您根本没有创建委托。委托是实现一组特定委托方法的对象。您没有创建任何这样的对象,至少在您显示的代码中。
我创建委托
不,您已经定义了委托协议。您还没有实例化采用该协议的类。您引用的教程在它使用的语言中非常草率,并且没有真正区分delegate protocol
,即期望给定类型的委托实现的方法集和委托 em> 本身,即向委托者提供这些方法的特定对象。
在类 UserTableViewController 我符合委托 UserTableViewDelegate 然后
这是正确的想法,但如果表达式 delegate?.helpClicked()
没有被调用,因为 delegate
为 nil,那么您一定未能将控制器分配为表的委托。有时可以在故事板中分配委托,就像将视图控制器连接到其视图一样。如果有问题的表格使用静态单元格,您可以这样做,其中所有单元格都是在情节提要中创建的。只需将HelpTableViewCell 的delegate
设为IBOutlet,然后将其连接到UserTableViewController。不过,更常见的情况是,表格单元格是动态的并在运行时进行配置。在这种情况下,您需要在配置单元格时为 HelpTableViewCell 设置 delegate
属性,很可能在 tableView(_:cellForRowAt:)
中。
也就是说,在您描述的情况下,您可能根本不需要担心委托。当用户与单元格交互时,已经通知了表格视图的委托。您没有在这里说您是在 ios 还是 MacOS 中工作,但这并不重要:UITableViewDelegate (iOS) 和 NSTableViewDelegate (macOS) 都有在点击或单击单元格时调用的方法。单元格通常是非常轻量级的对象——它们通常主要担心正确显示其内容并将用户交互留给表格的委托(几乎总是视图控制器)。
【讨论】:
【参考方案2】:在UserTableViewController
中,您还需要设置委托属性,如下所示 -
nameofyourCustomcellObject.delegate = self
【讨论】:
以上是关于自定义委托始终为零的主要内容,如果未能解决你的问题,请参考以下文章
带有自定义单元格的 UITableView 弹出窗口失败,单元格属性始终为零
iOS 7 UITableView indexpath 行属性为零