发送到实例的无法识别的选择器 - 仅限Swift 4

Las*_*boy 3 selector uitableview ios swift swift4

我无法理解这个错误的含义.我的应用程序工作正常,直到我迁移到Swift 4.现在我tableView:numberOfRowsInSection在尝试打开几个视图控制器时遇到此错误.我在Swift 3.2中没有遇到任何这些错误.在所有情况下都实现了numberOfRowsInSection方法,并且看起来很好.谁能指出我正确的方向?

2017-11-26 10:21:04.973523-0600 Y2GOsp [27701:6382461] - [Y2GOsp.ClientDetailViewController tableView:numberOfRowsInSection:]:无法识别的选择器发送到实例0x7fa51c89f000 2017-11-26 10:21:43.328635-0600 Y2GOsp [27701 :6382461]***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [Y2GOsp.ClientDetailViewController tableView:numberOfRowsInSection:]:无法识别的选择器发送到实例0x7fa51c89f000'

numberOfRowsInSection实现:

例1:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}
Run Code Online (Sandbox Code Playgroud)

例2:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dayAppoints.count
}
Run Code Online (Sandbox Code Playgroud)

vac*_*ama 14

@Hamish在评论中发现了这个问题.你忘了添加UITableViewDataSource到你的class声明中.因此,您的数据源方法未暴露给Objective-C.

我建议尝试添加@objc方法确认了这个问题.

这在Swift 3中起作用的原因是,派生自NSObject(UIViewController确实)的所有类的方法都可用于Objective-C.

在Swift 4中(由于SE-0160),有必要显式地标记@objc将通过选择器调用的函数,除非你覆盖在基类中如此标记的函数,或者在这种情况下,如果函数满足@objc协议定义的要求.