web-dev-qa-db-ja.com

Xcode 6の「表示」セグエがビューコントローラーをiOS 7のモーダルとして表示する

Xcode 6.1でビルドしたiPhoneアプリケーション(Swiftで構築)に2つのビューコントローラーがあり、ストーリーボードを使用しています。

最初のビューコントローラーはストーリーボードのナビゲーションコントローラーに埋め込まれ、2番目のビューコントローラーのセグエは「表示」セグエです。

アプリケーションを実行すると、遷移はiOS 8.xではプッシュとして適切に表示されますが、iOS 7.xではナビゲーションバーのないモーダルとして表示されます。

私のアプリケーションの要件は、iOS 7かiOS 8かに関係なく、移行をプッシュとして表示することです。これをiOSの両方のバージョンでプッシュとして機能させるためのアイデアはありますか?

この問題が言及されている関連記事を見ましたが、問題の解決策を見つけることができませんでした: ストーリーボードXcode 6の適応セグエ6.プッシュは非推奨ですか?

どんな助けでもありがたいです...

ありがとう

28
momentsnapper

このソリューションは、次の点で他のソリューションとは異なります。

  1. 問題を調査および検証する方法が含まれています
  2. 問題の原因はソースに追跡されます(セグエタイプの変更)
  3. 解決策は非常に簡単です(新しいセグエを削除して再作成します)
  4. 本文の要件に注意してください

私は 非常に詳細なSO回答 を与えただけで、何が起こっているのか、そして理由が完全に説明されていますが、簡単な解決策は、プッシュしていないセグエを削除してから再作成することですその理由は、セグエに壊れたxmlのビットがある可能性が高いためです(この問題を確認する方法/手順については、拡張回答を参照してください)。

ビュー階層内に少なくとも1つのUINavigationControllerがあることを確認したら、セグエが手動のセグエではなく、それに関連付けられたアクションがないことを確認します(ストーリーボードでセグエをソースコードとして表示します)。既存のセグエを削除してから、Ctrlキーを押しながらUIView/UIControlからターゲットビューコントローラーにドラッグします。カスタムアクションが必要な場合は、宛先コントローラーの呼び出しをprepareForSegueでインターセプトします。

また、このソリューションが機能することを確認するには、次の手順を実行してください。

  • 最初のビューコントローラー(矢印が付いている)がUINavigationControllerであり、ルートビューコントローラーとして通常のコンテンツビューコントローラーがあることを確認します。 (または、最初のビューコントローラをUINavigationController内に埋め込む)
  • 非常によく似た質問(上記にリンク)に対する以前の回答についての私の拡張コメントを読んでください。
22
Tommie C.

UINavigationControllerではなく、UIViewControllerにInitial View Controllerを割り当てた可能性があります。また、UIViewControllerを選択し、[Is Initial View Controller]オプションがオフになっていることを確認します。

Set the UINavigationController as the Initial View Controller

10
jomafer

ここ はその回避策です。 Xcode for iOS 7のバグのようです。ダミーのUINavigationControllerを作成し、すべての無料のUIViewControllerをこのナビゲーションコントローラーにリンクする必要があります。私のために働いた。

6
Alina

これはXcode 7.2のバグだと思います。回避策として、「プッシュ(非推奨)」セグエを作成し、ストーリーボードエディターでセグエを選択して、表示に変更します(例:プッシュ)。

6
Das

私にとって、ストーリーボードにはナビゲーションコントローラがありませんでした。ナビゲーションコントローラーをプログラムで作成しています。これはiOS8では正常に機能しますが、iOS7では機能しません。

[〜#〜]ソリューション[〜#〜]

  1. ストーリーボードでメインビューコントローラーを選択し、Xcodeメニューでエディター>埋め込み>ナビゲーションコントローラーを選択します。
  2. 新しいナビゲーションコントローラーを選択し、右側の属性インスペクターのView Controllerで、Is Initial View Controllerがチェックされています。
  3. アプリを実行します。今すぐ修正する必要があります。
4
kwahn

私は年齢の「表示(例:プッシュ)」でこの問題を抱えていましたが、ポップオーバー内のナビゲーションコントローラーにビューコントローラーをプッシュしようとしたときにそれを理解しました。呼び出されたView Controllerのコンテキストに問題があるようです。だからこれは私がそれを解決した方法です:

  1. セグエを実行するビューコントローラーで、ストーリーボードの「コンテキストの定義」プロパティを確認します。
  2. 呼び出されたView Controllerで、Presentationプロパティを「Current Context」に設定します。
3
Jeremy Bassett

私はこの問題に遭遇し、私のために機能することがわかった唯一の解決策は、非推奨の「プッシュ」セグエを使用することです。

2
ThomasW

XCode 9でSwift 4.を使用しています。このバージョンは昨日(9月20日)にリリースされました。

私にとって、これは単なるキャッシュのバグでした。 「Present Modally」を選択してアプリを実行し、「Show(e.g. Push)」を選択する必要がありました。これですべてが正常に動作します。

2
Shanakor

基本的に、Jomaferの答えは部分的に正しいです。プッシュするコントローラーの前には、UINavigationControllerを付ける必要があります。 UINavigationControllerをプッシュする必要はまったくありません。ストーリーボードがUINavigationController内でそれを知っている限り、すべてが順調です。

1
Wesley

テストで "Show"セグエがモーダルセグエとして表示される場合、通常は次の2つの問題のいずれかです。

  1. 最初のビューコントローラーはナビゲーションコントローラー内にありません。

  2. ストーリーボードXMLが破損しています。

#2の解決策は通常、セグエを削除して置き換えることであり、それ自体が修正されるはずです。他のプレゼンテーションスタイルに切り替えて実行し、「表示」に戻すだけで修正される場合があります。

これは、「Show Detail」セグエにも発生する可能性があり、より油断ならない場合があります。

例:UISplitViewControllerに配置された一連のビューコントローラーがあります。表示->表示->表示->詳細の表示のセグエがあります。最後のセグエはモーダルになり続けました。私はその最後のセグエを修正するためにすべてを試みました。問題はアップストリームショーセグエが破損してショーディティールセグエになっていたことです(ストーリーボードがショーセグエだとまだ言っていたとしても)。私はiPhoneでテストしていましたが、iPadシミュレーターで実行するまで実際の問題を発見できませんでした。セグエは、Show-> Show-> Show Detail-> Show Detailになりました。 iPhoneでは、3番目のセグエはナビゲーションコントローラーに折りたたまれたため、ショーのように見えました。ただし、それはdetailビューコントローラーであり、Show Detail from詳細ビューコントローラーを持つことはできないため、OSはビューコントローラーを取得するためにできることを実行します画面に表示し、モーダルに表示します。

レッスン1:常にiPadでUISplitViewControllerをテストして、セグエが意図したとおりに動作していることを確認します。

レッスン2:セグエが予期せずモーダルになる場合は、pstreamセグエの破損と問題のセグエをチェックします。

0
DrSmart

私の場合の問題は、Show(e.g. Push)segue beforeを作成して、ViewControllerをUINavigationControllerのrootViewControllerとして配置することでした。つまり、UINavigationControllerがありませんでした。それから私はシークを削除しましたINavigationControllerを追加して再度シークを追加しましたそしてそれはうまくいきました。 Xcode 9.0.1/iOS 11.0.3でテスト済み。

0
Josip B.