符合 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 = selftableView.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 = selfaboutTableView.delegate = self,我的表格视图是空白的。这是为什么呢?

是否仍然需要此代码,因为我在 swift 中看到许多不再包含此代码的 youtube 教程,我很困惑为什么我的代码没有它就无法工作?

【问题讨论】:

这与语言无关。 – 但请注意,如果您有 UIViewController 或 UITableViewController 子类,情况会略有不同。后者已经给自己设置好了它的tableView的delegate和数据源。 在功能上,Swift 的行为与 ObjectiveC 没有什么不同。 Swift 的强大来自于语言的特性。 【参考方案1】:

首先,即完全独立于哪种语言 你使用 Swift 或 Objective-C。

但是有两种不同的情况可能会导致混淆:

UITableViewController 子类:

UITableViewController 已经符合UITableViewDataSourceUITableViewDelegate。它有一个tableView 属性, 其dataSourcedelegate 属性已设置为self

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

具有UITableView 属性的UIViewController 子类:

在这里,您在子类中定义了一个 UITableView 属性 并在您的代码中初始化它,或者 将其连接到界面构建器中的表格视图。

在这种情况下,您必须设置 dataSourcedelegate 表格视图的属性,无论是在代码中还是在界面中 builder,如luk2302's answer 中所述。

如果数据源和委托是视图控制器本身, 那么你必须明确声明协议一致性, 并实施 数据源和委托方法(但没有覆盖 超类方法)。


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

【讨论】:

很好的补充,我不知道 UITableViewController 已经是它自己的数据源和委托 - 我猜我从来没有子类化一个但总是使用常规 UIViewController。【参考方案2】:

是的,仍然需要一些分配。 通过代码显式地

您可以做的是已经在界面构建器中连接它们,从而使通过代码的显式分配变得过时。这可能是很多教程所做的。

【讨论】:

以上是关于符合 Swift 中的 UITableViewDelegate 和 UITableViewDatasource?的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 不能符合 Swift 中的协议

类型“myViewController”不符合 Swift 中的 UIPIckerDataSource 协议

Swift-Mailer 错误,“给定 [] 邮箱中的地址不符合 RFC”

如何让我的简单对象符合 Swift 中的 NSManagedObject 和 NSCoding

符合协议和类的 Swift 属性

符合 Swift 协议的泛型类型