Xcode6でmodal segueがうまくunwindできない人の対症療法


ども、ストーリーボードオタクのtaです。ストーリーヲタじゃないよ? あとストリートヲタでもない。
図とかコードとかないので読みづらいと思いますが相済みません。なにかしら困ってる方のヒントになれば。

なお、結論から言うと、「unwind先を別に設定しろ」です。

XCode5では、どうだったのか

UINavigationControllerとリレーション接続したViewControllerから、モーダルセグエでモーダルなVCに遷移するパターンを想定します。
(NavControllerでVCを包むのは、画面の統一感を出したいとか、上部の左右に、ボタンを簡単に実装したいとか、そんな理由です)

XCode5では、NavgationController(N)と実際に表示するViewController(A)とをストーリボード上でリレーション接続します。
次に(A)と別のVC(B)をモーダルセグエで接続した場合、unwindによる(B)の戻り先を(A)と指定していました。
(NavigationControllerにソースコード追加しないで済むし、遷移の対応付けとしては、常識的な感じがしますね)
そして、これは、期待通りiOS7でも8でも動作します。(XCode5でコンパイルした場合)

しかしXCode6では動かない

このプロジェクトをXcode6に持ってきて、つまり、iOS8SDKでコンパイルするとモーダルパネルが「unwindできん」ので「動かないよ、リセットリセット」と、割と致命的な不具合が起きるんですよ、デギン閣下。このバイナリは、iOS7でも8でも不具合を起こしてしまいます。(微妙に動作が異なる)
いろいろ試してみましたが、この状態でも、さらに孫のmodalから(B)へのunwindは普通に動くし、(B)に設定したsegue「以外」のIBActionセレクタはEvent駆動するし、ボタンを押すと押されたアニメーションもするので、画面がフリーズしてるわけでもない。

ひらめきによる回避策

んで、ものは試しに! NavigationController(N)に、unwindの戻り先セレクタを記述し、直接(B)から、unwindしてやったら、なんと動きやがりました!!!
他に、TABBarControllerを使っている場合、そっちにunwindしてやったり、他のTAB配下のVCにunwindしても動いたりするようです。なんでやねん。
「遷移」の記述方法という観点で見ると、非常に不審で、甚だ怪しい感じですが、とりあえず回避策として、Xcode6でも動くようになりました。納得いかん。

あくまで一時的な対症療法と思いますが、unwind先を変えてみて問題なさそうならそれで行く、という感じですかね〜。ということで、特殊なコードを追加せず解決してみました。

以上、サイド3からのレポートを終わります。寒いのう。

閑話。

Xcode5.1.1でコンパイルしたものは、iOS8の実機でも期待どおりunwindできるので、他にバグがないのであれば、性急に対応する必要は無いです(リリース済みアプリで不具合起きてるのかと思って一瞬ビビりますね)

Xcode6ではモーダルセグエは非推奨。(あ、プッシュも)。ということなので、新規アプリではまったく別のアプローチのUIを考えるのもいいでしょう。

しかし、そもそも、なんでiOS7と8のSDKでそんなに動作が異なる事態になってるのさ? デグってるように見えるじゃん? 非推奨にしたからといって、元々の動作と異なるものにしていい道理はないんで、小一時間問い詰めたい。小一時間と言わず問い詰めたい。
休題。