Edited at

UITableViewのdidSelectRowAtが特定のSimulatorで呼ばれなくて実機で呼ばれる現象の回避策

More than 1 year has passed since last update.

原因は特定できない。しかし、再現できる。


問題

UITableViewのdidSelectRowAtがSimulatorで呼ばれなくて実機で呼ばれる。


環境

僕がつかってる環境


  • Xcode Version 9.4.1 (9F2000)


詳細


  • ソースコードは実機/Simulatorで同一

  • 作業前にソースを戻しても同じ


    • 念のため製品版としてリリース済みのソースコードに戻したが問題はおこったままであった。



  • pod updateしても変わらない。


    • 外部のライブラリが原因の可能性があると考えて、製品版として使っていた外部ライブラリのバージョンを指定してやってみたが、問題はおこったままであった。



  • ErrorやWarningは出ていない。


    • Constantsとかの警告もなし

    • didSelectRowAtが来ないTableViewでは警告なし

    • 作業中のstoryboard等では警告有り

    • 作業中のstoryboardと問題となってるUITableViewがあるstoryboardは別



  • DrivedData削除してもだめ

  • キャッシュ削除してもだめ

  • Simulatorと実機の接続先(データダウンロード元)は同じ

  • アインインストール→インストールしてもだめ

  • 透明のViewか何かが一番手前に表示されている可能性を確認するために、スクロールできることや別画面上にあるボタンがタップできることなどを確認した。

  • 問題発症時はスクロールが全て「スクロールしてタップ」の扱いになってた様な気がする。(気のせいかも知れない)


補足: 「呼ばれない」「呼ばれる」とは何をもってそう言ってるのか

問題がおこる画面のUITableView内に表示されているCellをタップすると、func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) が呼び出されない。

何故呼び出されないと判断したかは、debugPrintやbreakpointを設定して、ログが出ないことやbreakpointで停まらないため。

なお、そのソースコードがCustomClassとして使っているのか確認するためにviewDidLoadnumberOfRowsInSection が期待通り動くことを確認している。

本当に動かない画面のStoryboardやClassに対してログを吐き出すようにしたのかというのも不安だったので、 CaptureViewHierarchy を使ってきちんとViewを確認したりもしている。


端末別状態

動く:


  • Simulator iPhone7 PLUS / iOS11.4 -> 問題無し

  • Simulator iPhone 8 / iOS11.4 -> 問題無し

  • 実機 iPhoneX -> 問題無し

  • Simulator iPhoneX / iOS11.4 -> 問題無し

動かない:


  • Simulator iPhone 8 PLUS / iOS11.4 -> うごかねぇ!!


発生したタイミング

作業中に不意におこった、そのため具体的に記録を取っていないが、こんなタイミングだった。

以下、問題のあった画面を画面A、問題の無い画面全てを画面Bと言う。(画面Aと画面BはStoryboardとxibは共通していない)


  • 画面Bに対して、Xcodeで新規機能の実装作業中

  • 画面Bの切りの良いタイミングが出来上がる(画面Aは動くことを確認済み)

  • 画面Bの変更点をSouceTreeでCommit

  • 画面Aに問題が発症 ←!?


補足


  • 不意に画面Aに問題が出た状態のため、変更を画面Aに対しておこなってしまった可能性を考えて、gitの履歴を除くが、変更点はなかった。


    • UITableViewでdidSelectRowが呼ばれない原因として、よくあるdelegate設定があるが、既に設定済みであったため問題なかった。




再現方法

2018/10/09、再現しました。

キーボードのOptionキーを押した状態のまま、フォーカスをSimulatorから外して、Xcode側でRebuildをすると再現しました。

以下手順を、1秒から2秒以内程度に素早くおこなうかつマウス操作は一切しないと高確率で再現します。

(操作の都合上、Magnetという画面サイズの操作できるアプリに依存しているようですが、利用しているライブラリに依存した問題ではないと言い切れるほど調べれていません。)


  1. macOS上でSimulatorにフォーカスを当てた状態でOption+Controll+Command+「←」キーを押す


    1. この操作は僕の環境だと、Magnetで画面サイズを左側に寄せる操作になってる



  2. その状態で素早くCommand+TabでXcodeに切り替える


    1. この状態で、Simulator上でピンチイン-ピンチアウト操作をSimulateするときに表示される○いやつが表示されていると、再現します。



  3. その状態で素早くCommand+Rを押してRebuildすると問題が発生します


回避策

以下でこの問題を回避できた



  1. Simulator内の問題がおこってるアプリ削除


    1. これは不要です。Simulatorの再起動だけで治りました。



  2. Simulatorの再起動


    1. Simulator内のOS再起動




  3. Xcodeの再起動


    1. 不要です。



意味がわからん。

Xcodeの挙動が怪しいときはXcodeの再起動、DrivedData削除、キャッシュクリア、AppleIDのログアウトのみが定石と思っていたが、Simulatorの再起動やSimulator内のアプリ削除も今後は含めた方が良いと学んだ。

0.3人日返して欲しい。

以上...φ('ᴗ'」)