2017-10-31 6 views
0

私はApple Developerからチュートリアルを勉強しています:Start Developing iOS Apps (Swift)、私はプッシュとモーダルセグに混乱しています。ナビゲーションスタックからViewControllerをポップアップ

2つのシナリオ、[キャンセル]ボタンが押された場合には、シーン2退けるために別のメソッドを呼び出しますが、シーンからシーン1にバックアップ、2

を保存し、ナビゲーションバーで[キャンセル]ボタンをあります

@IBAction func cancel(_ sender: UIBarButtonItem) { 
    // Depending on style of presentation (modal or push presentation), this view controller needs to be dismissed in two different ways. 
    let isPresentingInAddMealMode = presentingViewController is UINavigationController 

    if isPresentingInAddMealMode { 
     dismiss(animated: true, completion: nil) 
    } 
    else if let owningNavigationController = navigationController{ 
     owningNavigationController.popViewController(animated: true) 
    } 
    else { 
     fatalError("The MealViewController is not inside a navigation controller.") 
    } 
} 
は、

sceneがモーダルsegueで表示されている場合、dismiss(animated:completion :)が呼び出され、シーンがpush segueで表示される場合は 、ViewControllerをポップアップするためにpopViewController(animated :)が呼び出されます。ナビゲーションスタック。

しかし、[保存]ボタンの場合、チュートリアルはシーン2のメソッドをオーバーライドし、準備する(送信者:)と、シーン1のアクションメソッドunwindToMealList(送信者:)をオーバーライドします。 そしてSaveボタンをExit(シーンドックのボタン)にドラッグし、unWindToMealList(sender :)メソッドを選択します。 フローは次のようになります:prepare(for:送信者:) - > scene 2が破棄され、シーン1が表示されます - > unWindToMealList(送信者:)

シーン2とシーン2を明示的に却下していないのでしょうか?保存ボタンを押すと、ナビゲーションスタック内のViewControllerを削除します。 私は、モーダルセグがViewControllerをナビゲーションスタックに押し込まないことを知っていますが、push segueはプッシュします。 なぜコードスニペットがナビゲーションスタックからポップアップしないのですか?

多くのありがとうございます。

答えて

1

読んでいるチュートリアルはunwind seguesを使用しているようです。

普通のセグと同様に、巻き戻しセグはソースと宛先を持ち、prepareForSegueで準備することができますが、宛先VCを提示するのではなく、宛先VCが表示されるようにソースVCを却下します。

アンワインドセグは、状況によって異なる動作をします。プッシュセグを使用してVC AからVC Bを表示し、BからAを巻き戻すと、巻き戻しセグはナビゲーションスタックからVC Bをポップします。 VC AからVC Bをモーダルに提示すると、アンワインドセグはモーダルに提示されたVCを却下します。

ご覧のとおり、巻き戻しセグはかなりスマートです。宛先VCを表示するために何をすべきかを決定します。ナビゲーションスタックに2つ以上のVCをポップすることもできます。

+0

入手しました。ありがとう! – Nestarneal

関連する問題