web-dev-qa-db-ja.com

認識されないセレクターがインスタンスに送信されました-Swift 4のみ

このエラーの意味を理解するのに苦労しています。 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
}
3
Lastmboy

@Hamishは、コメントで問題を特定しました。 UITableViewDataSource宣言にclassを追加するのを忘れました。そのため、データソースメソッドはObjective-Cに公開されませんでした。

メソッドに@objcを追加してみるという私の提案は、問題を確認しました。

これがSwift 3で機能した理由は、NSObjectUIViewControllerが行う)から派生したクラスのすべてのメソッドがObjective-Cで利用可能だったためです。

Swift 4 (SE-0160による) では、関数に@objcを明示的にタグ付けする必要があります。これは、あなたがいない限り、セレクターを介して呼び出されます。基本クラスでそのようにマークされている関数をオーバーライドするか、この場合、関数が@objcプロトコル定義の要件を満たしている場合。

12
vacawama

私は同じ問題を抱えていて、vacawamaの提案に従いました。しかし、すべての委任されたメソッドの前に@objcを追加する代わりに(@objcタグは非常に醜いです)、ViewControllerにUITableViewDataSourceプロトコルとUITableViewDelegateプロトコルを実装させました(UITableViewを含む汎用VC)そして、私のViewControllerをデータソースおよびデリゲートとして明示的に彼のtableViewに割り当てました。

self.tableView.delegate = self
self.tableView.dataSource = self

そしてそれは醜い@objcタグなしで魅力のように機能します。実際、私は当初、InterfaceBuilderを使用して(ctrl +クリックを介して)デリゲートとデータソースをtableViewに割り当てました

0
AleGiovane