LoginSignup
9
9

More than 5 years have passed since last update.

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

Posted at

ども、ストーリーボードオタクの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でそんなに動作が異なる事態になってるのさ? デグってるように見えるじゃん? 非推奨にしたからといって、元々の動作と異なるものにしていい道理はないんで、小一時間問い詰めたい。小一時間と言わず問い詰めたい。
休題。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9