1

今天我更新到了新发布的 xCode 6 GM。当我现在尝试构建我的应用程序时,我收到一个编译器错误,说我的一个处理表的视图控制器“不符合协议 UITableViewDataSource”。之前一切正常(使用 xCode 6 Beta 5)

根据文档,该协议需要两种方法:

– tableView:cellForRowAtIndexPath: 必需的方法

– tableView:numberOfRowsInSection: 必需的方法

它们都实现了:

 func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return feed!.count
 }

 func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        println("HashtagDetailViewController: tableView - cellForRowAtIndexPath called")

        let cell = tableView.dequeueReusableCellWithIdentifier("postCell", forIndexPath: indexPath) as PostTableCell
        cell.loadItem(feed!.toArray()[indexPath.row])
        return cell
 }

我错过了什么?是否有文档中没有的新必需方法?谢谢你的帮助

4

2 回答 2

7

在最新的 beta 版本中,许多 Swift 签名在使用可选项时发生了变化。因此,您现有的实现成为重载的本地方法,而不是协议方法的实现。如果它是协议中的必需方法,您将收到这些消息,因为编译器假定您尚未实现所需的方法。

在这里,这是一个小麻烦,但如果您在更改了签名的此类协议中实现了可选方法,则会更加危险。您不会收到任何编译器警告,并且您认为实现了协议方法的方法将永远不会被调用。

您必须手动检查每个此类现有实现,以确保您的代码不会发生上述情况。

执行此操作的最简单方法是将光标放在每个此类方法标题中,因为您通常会在该方法的侧窗口中获得快速帮助。如果它被正确键入为协议方法,您将在最后定义它的框架的快速帮助中看到该方法的描述。如果它由于签名差异而成为本地方法,您将不会在“快速帮助”窗口中看到任何描述,而是相关方法的列表以及更多说明它是在该本地文件中定义的行。

在这样的框架更改之后,我不知道有什么方法可以阻止手动检查代码中每个现有的可选实现。

协议略有改变:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!

就是现在:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
于 2014-09-10T13:13:27.550 回答
2

除了上一个正确的答案之外,我还要添加一件事 - 您可以使用以下语法:

override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell {

为了执行一些有用的“if语句”,如下所示:

    if let theIndexPath = indexPath {
        var data: NSManagedObject = someList[indexPath!.row] as NSManagedObject;
        // your code here
    }

或者

    if let tblView = tableView {
        tblView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade);
        // your code here
    }
于 2014-09-11T07:52:15.460 回答