我正在学习swift 2.0,我想知道您是否仍然需要添加代码tableView.datasource =self并tableView.delegate = self像在Obj-C中那样遵守协议?
tableView.datasource =self
tableView.delegate = self
示例代码:
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
aboutTableView.datasource =self
aboutTableView.delegate = self``viewDidLoad
仍然需要此代码,因为我很快就看到许多YouTube教程不再包含此代码,而我困惑为什么没有它我的代码就不起作用?
首先,这完全与您使用的语言(Swift或Objective-C)无关。
但是,有两种情况可能会引起混淆:
一个UITableViewController子类:
UITableViewController
UITableViewController已经符合UITableViewDataSource 和UITableViewDelegate。它有一个tableView特性,它dataSource和delegate属性已经被设置为self。
UITableViewDataSource
UITableViewDelegate
tableView
dataSource
delegate
self
在子类中,通常 会覆盖 数据源和委托方法。
UIViewController 具有UITableView属性的子类:
UIViewController
UITableView
在这里,您已经UITableView在子类中定义了一个属性,并在您的代码中对其进行了初始化,或者将其连接到接口构建器中的表视图。
在这种情况下,您必须 在代码或接口构建器中设置tableview 的dataSourceand delegate属性,如luk2302的answer中所述。
如果数据源和委托是视图控制器本身,则必须显式声明协议一致性,并 实现 数据源和委托方法(但不能 覆盖 超类方法)。
当然,在两种情况下,都可以将表视图数据源和委托设置为 不同的 对象,而不必是视图控制器本身。