符合 Swift 中的 UITableViewDelegate 和 UITableViewDatasource?
Posted
技术标签:
【中文标题】符合 Swift 中的 UITableViewDelegate 和 UITableViewDatasource?【英文标题】:Conforming to UITableViewDelegate and UITableViewDatasource in Swift? 【发布时间】:2016-01-02 11:51:44 【问题描述】:我正在学习 swift 2.0,我想知道您是否还需要像在 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
现在表格视图会在每个单元格中加载正确的数据。
但是,如果我从 viewDidLoad
中删除 aboutTableView.datasource = self
和 aboutTableView.delegate = self
,我的表格视图是空白的。这是为什么呢?
是否仍然需要此代码,因为我在 swift 中看到许多不再包含此代码的 youtube 教程,我很困惑为什么我的代码没有它就无法工作?
【问题讨论】:
这与语言无关。 – 但请注意,如果您有 UIViewController 或 UITableViewController 子类,情况会略有不同。后者已经给自己设置好了它的tableView的delegate和数据源。 在功能上,Swift 的行为与 ObjectiveC 没有什么不同。 Swift 的强大来自于语言的特性。 【参考方案1】:首先,即完全独立于哪种语言 你使用 Swift 或 Objective-C。
但是有两种不同的情况可能会导致混淆:
UITableViewController
子类:
UITableViewController
已经符合UITableViewDataSource
和UITableViewDelegate
。它有一个tableView
属性,
其dataSource
和delegate
属性已设置为self
。
在您的子类中,您通常覆盖 数据源和委托方法。
具有UITableView
属性的UIViewController
子类:
在这里,您在子类中定义了一个 UITableView
属性
并在您的代码中初始化它,或者
将其连接到界面构建器中的表格视图。
在这种情况下,您必须设置 dataSource
和 delegate
表格视图的属性,无论是在代码中还是在界面中
builder,如luk2302's answer 中所述。
如果数据源和委托是视图控制器本身, 那么你必须明确声明协议一致性, 并实施 数据源和委托方法(但没有覆盖 超类方法)。
当然,在这两种情况下,表视图数据源和委托 可以设置为 不同的 对象,它不必是 视图控制器本身。
【讨论】:
很好的补充,我不知道 UITableViewController 已经是它自己的数据源和委托 - 我猜我从来没有子类化一个但总是使用常规 UIViewController。【参考方案2】:是的,仍然需要一些分配。 通过代码显式地
或
您可以做的是已经在界面构建器中连接它们,从而使通过代码的显式分配变得过时。这可能是很多教程所做的。
【讨论】:
以上是关于符合 Swift 中的 UITableViewDelegate 和 UITableViewDatasource?的主要内容,如果未能解决你的问题,请参考以下文章
NSManagedObject 不能符合 Swift 中的协议
类型“myViewController”不符合 Swift 中的 UIPIckerDataSource 协议
Swift-Mailer 错误,“给定 [] 邮箱中的地址不符合 RFC”