ストーリーボードのモーダルセグとプッシュセグエの違いは何ですか?


178

modalpushセグエの正確な違いは何ですか?

pushセグエを使用するとスタックに追加されるので、使用pushを続けるとメモリを占有し続けることを知っていますか?

これら2つがどのように実装されているかを誰かに見せてもらえますか?

Modalセグエは単純ctrl-clickに宛先にドラッグすることで作成できますが、これを行うとpushアプリがクラッシュします。

私はへのボタンから押していUINavigationControllerていますUIViewController

回答:


174

プッシュセグエは、ナビゲーションスタックに別のVCを追加しています。これは、プッシュを発信するVCが、スタックに追加されるVCが属するのと同じナビゲーションコントローラーの一部であることを前提としています。メモリ管理は、ナビゲーションコントローラとディープスタックの問題ではありません。あるVCから別のVCに渡すオブジェクトを処理している限り、ランタイムがナビゲーションスタックを処理します。視覚的な表示については、画像を参照してください。 NavStack

モーダルセグエはモーダル別のVCを提示するだけで1つのVCです。VCは、ナビゲーションコントローラーの一部である必要はありません。モーダルに提示されるVCは、通常、提示する(親)VCの「子」であると見なされます。モーダルで表示されるVCは通常、ナビゲーションバーやタブバーよりも優れています。提示するVCは、作成および提示したモーダルVCを閉じる責任もあります。

お役に立てれば。


1
@EIJayは素晴らしい説明をありがとう。モーダルを使用する必要がある場合と、プッシュセグエをいつ使用するかについて、もう1つ質問があります。
Gaurav_soni

43
通常、概要ビューの詳細ビューを表示する場合は、ナビゲーションコントローラーとプッシュセグエを使用します。データが「子」ビューに関する限り、「親」ビューが実際には関連していない場合は、モーダルを使用します。モーダルビューの良い例は、ログインビューです。ログインビューは、データが「親」ビューに関する限り、実際には何の関係もありません。
LJウィルソン

5
@TJはい、「モデルチェーン」を作成できます。チェーンの下のVCを非表示にすると、チェーンの上のすべてのVCが非表示になります—ユーザーには、アニメーションを有効にしたときに上部のVCのみが表示されます。ナビゲーションコントローラーのようなものです。
Constantino Tsarouhas

3
@jchatardはい。セグエがモーダルである限り、ストーリーボードではナビゲーションバーが継承されていないことがわかります。そのため、モーダルチェーンの最初のVCをクリックし、メニューエディター->埋め込み->ナビゲーションコントローラーをクリックするだけです。これにより、すべてのモーダルチェーンに共通のナビゲーションコントローラーが設定されます。現時点では、ナビゲーションコントローラを表示するためのセグエのみが「モーダル」であるのに対し、モーダルチェーン内のすべてのセグエは「プッシュ」セグエである必要があるわけではありません。
HpTerm

3
プッシュは、セグメントしているVCがナビゲーションコントローラを使用している場合にのみ使用できます。ナビゲーションコントローラーに埋め込まれていないVCからプッシュしようとすると、例外がスローされます。したがって、これはデータが親子間でどの程度緊密に接続されているかとはまったく関係がなく、VCを管理するためにナビゲーションコントローラを使用しているかどうかに関係します。モーダル遷移を使用したセグエを使用して、まったく同じことを手動で行うことができます。
smileBot

22

Swift 3.0およびXCode 8.2.1アップデート

1.セグエを押す

プッシュセグエの名前がShow segueに変更されました。プッシュセグエを作成するには、親のビューコントローラーをナビゲーションコントローラーに埋め込む必要があります。ナビゲーションコントローラーはナビゲーションバーを提供します。2つのビューコントローラーをプッシュセグエで接続すると、子ビューコントローラーのナビゲーションバーが自動的に上部に配置されます。子ビューコントローラーがナビゲーションスタックの上に追加されます。

ここに画像の説明を入力してください

プッシュセグエは、デフォルトの機能も提供します。子ビューコントローラーには、親ビューコントローラーに戻るための戻るボタンがあります。右にスワイプして子ビューコントローラをポップすることもできます。プッシュセグエのアニメーションは、ページを水平にスライドするようなものです。

ここに画像の説明を入力してください

ナビゲーションコントローラーにないビューコントローラーからプッシュセグエを作成することはできますが、そうすると、ナビゲーションバー、アニメーション、ジェスチャーなどのすべての機能が失われます。この場合、最初に親ビューコントローラーをナビゲーションビューコントローラーに埋め込んでから、子ビューコントローラーにプッシュセグエを作成する必要があります。

ここに画像の説明を入力してください

2.モーダルセグエ

一方、モーダルセグエ(つまり、モーダルに存在)は、現在のビューコントローラー上に存在します。子ビューコントローラーはナビゲーションビューコントローラーを継承しないため、ナビゲーションビューコントローラーを備えたビューコントローラーからモーダルセグエを提示すると、ナビゲーションバーは失われます。子ビューコントローラーをナビゲーションコントローラーに再度埋め込み、必要に応じて新しいナビゲーションスタックを開始する必要があります。親View Controllerに戻りたい場合は、これを自分で実装しdismiss、コードから呼び出す必要があります。

ここに画像の説明を入力してください

モーダルセグエのアニメーションは、子ビューコントローラーがページの下部から表示されることです。ナビゲーションビューコントローラーもこのデモには含まれていません

ここに画像の説明を入力してください


6

プッシュビューはで構築する必要がありますnavigationController

をクリックしmaster view、メニューバーで次のいずれかを選択します。

EDITOR->embed in->navigationController

間違っていますが、なしpushViewで構築することもできnavigationController、この答えは不完全です!
Daksh Gargas

1

これは、ストーリーボードのカスタムプッシュおよびセグエメソッドを使用してコントロールをプッシュしています ストーリーボード

そしてモーダルは、ストーリーボードを使用せずにビューをナビゲートする方法です。


ストーリーボードを使用せずにモーダルセグエを作成する方法は?
jianpx 2013

@jianpx:ストーリーボードを使用する場合にのみセグエできます。それ以外の場合は、ビューを切り替えるためにナビゲーションコントローラまたはPresentModalViewControllerを使用できます。
Pushkraj 2013

@ Pushkrajありがとう。コードでセグエを作成する方法がないということですか?
jianpx 2013

@jianpx:必要ありません。ストーリーボードを使用する場合にのみ必要なセグエ。
Pushkraj 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.