このエラーの意味を理解するのに苦労しています。 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
}
例2:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dayAppoints.count
}
@Hamishは、コメントで問題を特定しました。 UITableViewDataSource
宣言にclass
を追加するのを忘れました。そのため、データソースメソッドはObjective-Cに公開されませんでした。
メソッドに@objc
を追加してみるという私の提案は、問題を確認しました。
これがSwift 3で機能した理由は、NSObject
(UIViewController
が行う)から派生したクラスのすべてのメソッドがObjective-Cで利用可能だったためです。
Swift 4 (SE-0160による) では、関数に@objc
を明示的にタグ付けする必要があります。これは、あなたがいない限り、セレクターを介して呼び出されます。基本クラスでそのようにマークされている関数をオーバーライドするか、この場合、関数が@objc
プロトコル定義の要件を満たしている場合。
私は同じ問題を抱えていて、vacawamaの提案に従いました。しかし、すべての委任されたメソッドの前に@objcを追加する代わりに(@objcタグは非常に醜いです)、ViewControllerにUITableViewDataSourceプロトコルとUITableViewDelegateプロトコルを実装させました(UITableViewを含む汎用VC)そして、私のViewControllerをデータソースおよびデリゲートとして明示的に彼のtableViewに割り当てました。
self.tableView.delegate = self
self.tableView.dataSource = self
そしてそれは醜い@objcタグなしで魅力のように機能します。実際、私は当初、InterfaceBuilderを使用して(ctrl +クリックを介して)デリゲートとデータソースをtableViewに割り当てました