自定义代表alwayse nil

时间:2017-02-27 13:18:06

标签: swift delegates

我完全遵循此tutorial来创建自定义委托。

我创建了委托

protocol UserTableViewDelegate: class {

    func helpClicked()
}

然后在班级HelpTableViewCell

弱var委托:UserTableViewDelegate?

@IBAction func helpButtonClicked(_ sender: UIButton) {
delegate?.helpClicked()
}

在课程UserTableViewController中,我符合委托UserTableViewDelegate,然后

func helpClicked() {
}

但是函数永远不会被调用。 HelpTableViewCell无效。

2 个答案:

答案 0 :(得分:1)

  

HelpTableViewCell类中的委托变量总是为nil而委托?.helpClicked()无效。

那是因为你还没有创建一个委托。委托是实现一组特定委托方法的对象。您至少在您已经展示的代码中没有创建任何此类对象。

  

我创建了委托

不,您已定义了委托协议。您还没有实例化采用该协议的类。您引用的教程在其使用的语言中非常草率,并且没有真正区分delegate protocol,即特定类型的委托应该实现的方法集,以及委托本身,即向委托人提供这些方法的特定对象。

  

在类UserTableViewController中我符合委托UserTableViewDelegate然后

这是正确的想法,但如果表达式delegate?.helpClicked()没有被调用因为delegate为nil,那么你必须将控制器分配为表&# 39;代表。有时,可以在故事板中分配代理,就像您将视图控制器连接到其视图一样。如果有问题的表使用静态单元格,那么您可以这样做,其中所有单元格都在故事板中创建。只需将HelpTableViewCell delegate作为IBOutlet,然后将其连接到UserTableViewController即可。但更常见的是,表格单元格是动态的并且在运行时配置;在这种情况下,您需要在配置单元格时为HelpTableViewCell设置delegate属性,最有可能在tableView(_:cellForRowAt:)中。

尽管如此,在您所描述的情况下,您可能根本不需要为代表团而烦恼。当用户与单元格交互时,已经通知表格视图的委托。你不会在这里说你是否在iOS或MacOS上工作,但这并不重要:UITableViewDelegate(iOS)和NSTableViewDelegate(macOS)都有点击单元格时调用的方法或者点击。单元格通常是非常轻量级的对象 - 它们通常主要担心正确显示内容并将用户交互留给表格的委托(几乎总是视图控制器)。

答案 1 :(得分:0)

在{{1}}范围内,您还需要设置委托属性,如下所示 -

nameofyourCustomcellObject.delegate = self