Swift 3:了解UITableViewDataSource方法的语法更改

时间:2016-09-15 20:21:27

标签: ios uitableview swift3

我对Swift 3函数调用有一些问题。以下是一个例子。

Old Swift:

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

斯威夫特3:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

上述语法没问题。但是现在Xcode向我显示了一个错误,并要求我这样做:

@objc(tableView:cellForRowAtIndexPath:) func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

我不明白为什么我要声明@objc(tableView:cellForRowAtIndexPath:)

只有在我尝试在扩展下实现表视图数据源方法时才会发生这种情况。此问题也不适用于numberOfRowsInSectionviewForHeaderInSection

任何人都可以帮助我理解为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

虽然我不确定是什么触发@objc,但我可以建议以下方法:

将tableView变量存储在viewDidLoad中的某个位置:

let tv = tableView!

然后将鼠标悬停在tableView变量上并同时按下命令按钮。

这会带您进入UITableView的界面

然后,将鼠标悬停在UITableViewDelegate或UITableViewDataSource上,并同时按下命令按钮。

现在您可以看到新的签名。

很多变化......快乐升级!

答案 1 :(得分:0)

如果从Objective c使用此函数,Swift编译器必须在函数之前强制写入Objc(funcName)。根据app doc

  

使用@objc(name)属性为其提供Objective-C名称   必要时的属性和方法。例如,您可以标记一个   调用的属性已启用,其中包含一个名为isEnabled的getter   Objective-C是这样的:

    var enabled: Bool {
    @objc(isEnabled) get {
        // ...
      }
   }
  • 要使其无效,请使用扩展名编写TableView数据源并委派
 extension YourViewControllerName:UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 10
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{

        let cell = tableView.dequeueReusableCell() as SplitAddContactCell
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80.0
    }

}