自定义委托始终为零

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 行属性为零

自定义数字格式字符串始终显示符号

在 UITabBarController 中,moreNavigationController 始终为零

将单元格从委托传递到 UITableViewController 时 indexPath 为零