【问题标题】:Conforming to UITableViewDelegate and UITableViewDatasource in Swift?符合 Swift 中的 UITableViewDelegate 和 UITableViewDatasource?
【发布时间】: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 的强大来自于语言的特性。

标签: ios swift uitableview


【解决方案1】:

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

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

UITableViewController 子类:

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

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

具有UITableView 属性的UIViewController 子类:

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

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

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


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

【讨论】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多