一尘不染

符合Swift中的UITableViewDelegate和UITableViewDatasource吗?

swift

我正在学习swift 2.0,我想知道您是否仍然需要添加代码tableView.datasource =selftableView.delegate = self像在Obj-C中那样遵守协议?

示例代码:

class AboutViewController: UIViewController, UITableViewDataSource,   UITableViewDelegate
{
    override func viewDidLoad()
    {
        super.viewDidLoad()

        // conform to protocols
        aboutTableView.dataSource = self
        aboutTableView.delegate = self
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 2
    }

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
    {
        return 50
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        // Code here
    }
}

现在,表格视图会在每个单元格中加载正确的数据。

但是,如果我从中删除aboutTableView.datasource =self和,则表视图为空白。为什么是这样?aboutTableView.delegate = self``viewDidLoad

仍然需要此代码,因为我很快就看到许多YouTube教程不再包含此代码,而我困惑为什么没有它我的代码就不起作用?


阅读 252

收藏
2020-07-07

共1个答案

一尘不染

首先,这完全与您使用的语言(Swift或Objective-C)无关。

但是,有两种情况可能会引起混淆:

一个UITableViewController子类:

UITableViewController已经符合UITableViewDataSource
UITableViewDelegate。它有一个tableView特性,它dataSourcedelegate属性已经被设置为self

在子类中,通常 会覆盖 数据源和委托方法。

UIViewController 具有UITableView属性的子类:

在这里,您已经UITableView在子类中定义了一个属性,并在您的代码中对其进行了初始化,或者将其连接到接口构建器中的表视图。

在这种情况下,您必须 在代码或接口构建器中设置tableview 的dataSourceand
delegate属性,如luk2302的answer中所述。

如果数据源和委托是视图控制器本身,则必须显式声明协议一致性,并 实现 数据源和委托方法(但不能 覆盖 超类方法)。


当然,在两种情况下,都可以将表视图数据源和委托设置为 不同的 对象,而不必是视图控制器本身。

2020-07-07