外包TableView协议

时间:2017-08-07 11:20:05

标签: ios swift uitableview

我想外包tableView的委托和数据源协议。 所以我创建了一个新的TableViewController,为它制作了Cocoa Touch Class 并删除了故事板中的现有委托和数据源连接。最后,我以编程方式设置委托和数据源。 它到目前为止工作正常,但我有一个问题。 请先看看我的代码。

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let protocols = TableViewProtocols()

        tableView.delegate = protocols
        tableView.dataSource = protocols
    }
}

正如我所说它工作正常,但我试图让它更容易,但这不起作用

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = TableViewProtocols()
        tableView.dataSource = TableViewProtocols()
    }
}

在第一个例子中,我创建了一个TableViewProtocols的对象,并将其保存在protocols中。我将它分配给了委托和数据源。这是有效的。

在第二个例子中,我没有保存TableViewProtocols的实例。相反,我在一行中创建并分配了一步。 这不起作用。我不知道为什么。因为对我来说它看起来是一样的。首先创建一个对象和创建并直接在一行中分配有什么区别?

任何建议都是适当的。 谢谢。

1 个答案:

答案 0 :(得分:0)

表视图不保留对其委托或数据源对象的强引用。因此,当您直接设置它们并且调用超出范围时,对象将被删除,并且tableview不再具有委托或数据源。

即使使用表视图控制器,拥有不同的数据源和代理也是完全可以接受的。一个简单的方法是让表视图控制器具有对您要委托的对象的引用,并且它具有强引用,然后在视图中设置委托和数据源加载:

class TableViewController:UITableViewController {

var protocols = TableViewProtocols()//不是最好的名字,但它是你拥有的。

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = protocols
    tableView.dataSource = protocols
}

}