現在のXcodeバージョン(10.2)には大きな問題があります。
次のシグネチャを持つBasicViewController
クラスがあります。
class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
次に、ExampleViewController: BasicViewController
のような別のロジックが追加された別のクラスがあります。
トリッキーな部分がやって来ます...
私たちはさまざまなシミュレーターやデバイスでアプリをビルドして実行し、すべてが適切に動作します。その後、アプリをアーカイブすると、突然didSelectRow
が起動しなくなります。プロジェクトの徹底的なクリーンアップにより、再度アーカイブする必要なしに問題を再現することができました。
これがいつ起こるかは、私には考えられません。さらに、アーカイブされたアプリを実行しているときにのみ、子クラスでUITableViewDelegate
メソッドが呼び出されないという同様の問題を見つけたため、さらに悪化します。アプリのアーカイブと送信中の一部の最適化に問題がありますか?
テーブルのdataSource
とdelegate
が適切に設定されていることを確認しました。テーブル上にジェスチャー認識機能がありません。同じロジックは、アプリを2回/ 3回実行した後はうまく機能しますが、プロジェクトを深くクリーンアップした後は初めて失敗します。
テストを行い、UITableViewDataSource
とUITableViewDelegate
を子クラスに設定すると、毎回期待どおりに機能します。プロトコルを継承してもうまくいかないようです。プロトコルを親に保持し、子クラスにも追加すると、子クラスのプロトコルは冗長であると表示されます。
誰かが似たような経験をしましたか?どんな提案でも大歓迎です。
Swift 5.0コンパイラで https://bugs.Swift.org/browse/SR-10257 を実行している可能性があります。これは、少なくとも3つのファイル:
BasicViewController.Swift
_SomeOtherFile.Swift
_ExampleViewController.Swift
__SomeOtherFile.Swift
_がAnyObject
型の値を呼び出した場合、wholemodule
モードでコンパイルされ、ファイルは上記の順序でコンパイラに渡されます(_SomeOtherFile.Swift
_は2つのうちの真ん中にあります)。その場合、コンパイラはfunc tableView(_:, didSelectRowAt:)
の実装について_@objc
_- nessを適切に推論できないようです。当面は、明示的に_@objc
_でタグ付けすることで回避できます。
同じ問題が発生しました。メインクラスに直接メソッドを追加して修正し、他のクラスではoverrideそれらを追加しました。これですべてが正しく呼び出されます。