2016-03-27 15 views
0

私は、4つ以上の連続したビューコントローラをUINavigationControllerに埋め込んだXcode 7.xでストーリーボードを構築しようとしています。 ナビゲーションコントローラは初期ビューコントローラです。 埋め込みは、単一のボタンを含むシンプルなビューコントローラです。このボタンは、Adaptive Show Segueに接続され、同様のビューコントローラを呼び出すなどの機能を備えています。各自が簡単なショー・セグーで次のものを呼びます。 プッシュは3回の連続コールに対してのみ機能し、その後はナビゲーションコントローラへの参照が失われます。 5番目のビューコントローラとそれ以降がモーダル表示されます。UINavigationControllerは最大4つのViewControllerしか処理できませんか?

私は、少なくとも

のiOS 8以降、別のプロジェクトでこの問題を抱えていますがUINavigationControllerのviewControllersは、4つのエントリに限定スタックですか?

More than 4 view controllers embedded in an UINavigationController

埋め込みビューコントローラのコード:

class ViewController: UIViewController { 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     print("ViewCintroller:\(title) NavController:\(navigationController) stack size:\(navigationController?.viewControllers.count)") 
     print() 
    } 
} 

出力:

ViewController:Optional("V1") NavController:Optional(<UINavigationController: 0x7fd57b024200>) stack size:Optional(1) 
ViewController:Optional("V2") NavController:Optional(<UINavigationController: 0x7fd57b024200>) stack size:Optional(2) 
ViewController:Optional("V3") NavController:Optional(<UINavigationController: 0x7fd57b024200>) stack size:Optional(3) 
ViewController:Optional("V4") NavController:Optional(<UINavigationController: 0x7fd57b024200>) stack size:Optional(4) 
ViewController:Optional("V5") NavController:nil stack size:nil 
ViewController:Optional("V6") NavController:nil stack size:nil 

非推奨プッシュタイプにすべてseguesを変える必要な結果をもたらします

ViewController:Optional("V1") NavController:Optional(<UINavigationController: 0x7fc8a1026200>) stack size:Optional(1) 
ViewController:Optional("V2") NavController:Optional(<UINavigationController: 0x7fc8a1026200>) stack size:Optional(2) 
ViewController:Optional("V3") NavController:Optional(<UINavigationController: 0x7fc8a1026200>) stack size:Optional(3) 
ViewController:Optional("V4") NavController:Optional(<UINavigationController: 0x7fc8a1026200>) stack size:Optional(4) 
ViewController:Optional("V5") NavController:Optional(<UINavigationController: 0x7fc8a1026200>) stack size:Optional(5) 
ViewController:Optional("V6") NavController:Optional(<UINavigationController: 0x7fc8a1026200>) stack size:Optional(6) 

編集:

私の意見では、問題はインターフェイスビルダーです。 私はすべてのショーセグを変更してセグをプッシュし、コンパイルし、プッシュセグを変更してセグを表示し、再度コンパイルして、異常を解消した作業ソリューションを得ました。ナビゲーションスタックは、これ以上4つのView Controllerに制限されません。

答えて

1

単純なショー・セグエで次の人を呼び出す各人。プッシュは3回の連続コールに対してのみ機能し、その後はナビゲーションコントローラへの参照が失われます。 5番目のビューコントローラ以降はモーダルで表示されます。

私はあなたの質問からこの引用を強調しました。

モーダルで表示されるビューコントローラは、ナビゲーションコントローラに埋め込まれていないため、そのnavigationControllerプロパティのためにnilを返します。モーダルではなくショーを5,6番目に表示し続けると、ナビゲーションコントローラがnilではないことがわかり、ナビゲーションスタックは引き続き増加し続けます(デバイスのメモリが不足するまで) )。

利用可能なデバイスメモリ以外に、ナビゲーションコントローラのナビゲーションスタックに追加できるビューコントローラの数に制限はありません。

ビューコントローラをモーダルに表示しても、ナビゲーションコントローラのナビゲーションスタックには表示されません。モーダルに表示されたビューコントローラは、navigationControllerプロパティのためにnilを返します。これは、ナビゲーションスタックに埋め込まれていないためです。私はこのNextViewControllerクラスを作成している

enter image description here


は、次の例を考えてみましょう。 View Controllerには、「Add Another」ボタンがあり、showAnotherメソッドに接続されています。このメソッドは別のNextViewControllerをインスタンス化し、スタックにプッシュします。 viewWillAppearでは、あなたのprepareForSegueメソッドにログインしているのと同じものをログに記録しています。

何度も「別のものを追加」を何度もクリックすると、別のビューコントローラがナビゲーションスタックに追加され続けます。ログメッセージからは、ビューコントローラの数が表示されます。スタックは増加しているよく 4を超えています。 (スクリーンショットの27)。これは記憶を消費し、最終的に私は使い果たします。ここで

NextViewControllerクラスのプレーンテキストのコードです:完了便宜上

import UIKit 

class NextViewController: UIViewController { 
    init() { 
     super.init(nibName: "NextViewController", bundle: NSBundle.mainBundle()) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     print("ViewCintroller:\(title) NavController:\(navigationController) stack size:\(navigationController?.viewControllers.count)") 
    } 

    @IBAction func showAnother() { 
     navigationController?.pushViewController(NextViewController(), animated: true) 
    } 
} 

、私は、ルートビューコントローラとしてNextViewControllerで新しいナビゲーションコントローラをインスタンス化する第二のボタンを追加しました。

青色のボタンをタップすると、同じことが早く起こります。現在のナビゲーションスタックに別のNextViewControllerを追加し、カウントを増やします。オレンジ色のものをタップすると、新しいスタックが表示されます(ナビゲーションコントローラのメモリアドレスが異なっていることがわかります)。カウントは1にリセットされます。

enter image description here

ここではそのスクリーンショットからのコードです:

import UIKit 

class NextViewController: UIViewController { 
    init() { 
     super.init(nibName: "NextViewController", bundle: NSBundle.mainBundle()) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     print("ViewCintroller:\(title) NavController:\(navigationController) stack size:\(navigationController?.viewControllers.count)") 
    } 

    @IBAction func showAnother() { 
     navigationController?.pushViewController(NextViewController(), animated: true) 
    } 

    @IBAction func presentModally() { 
     let anotherNavigationStack = UINavigationController(rootViewController: NextViewController()) 
     presentViewController(anotherNavigationStack, animated: true, completion: nil) 
    } 
} 

注青は「追加別」ボタンをshowAnother()にフックアップされ、オレンジ色の「現在のモーダル」ボタンがにフックアップされていることをここにpresentModally()。ここで

は、ログからのサンプルです:これらのログの

ViewCintroller:nil NavController:Optional(<UINavigationController: 0x7fa889810800>) stack size:Optional(8) 
ViewCintroller:nil NavController:Optional(<UINavigationController: 0x7fa88c057a00>) stack size:Optional(1) 
ViewCintroller:nil NavController:Optional(<UINavigationController: 0x7fa88c057a00>) stack size:Optional(2) 
ViewCintroller:nil NavController:Optional(<UINavigationController: 0x7fa88c057a00>) stack size:Optional(3) 
ViewCintroller:nil NavController:Optional(<UINavigationController: 0x7fa88c042800>) stack size:Optional(1) 

ライン1は、連続8回目のための青いボタンをタップ表します。 2行目は、オレンジ色のボタンをタップしたことを表します。メモリアドレスが0x7fa889810800から0x7fa88c057a00に変更されていることに注意してください。 3行目と4行目は青いボタンのタップを表します。メモリアドレスは0x7fa88c057a00のままですが、ナビゲーションカウントは最大3(1つのオレンジタップに続いて2つのブルータップを表す)に増えます。その後、5行目でオレンジ色のボタンをタップし、メモリアドレスが0x7fa88c057a00から0x7fa88c042800に変更され、カウントが再び1にリセットされます。

+0

はい、問題は、他のView Controllerをモーダルで表示していないことです。私はすべてのビューコントローラで同じショーセグを使用しています。しかし、システムは、第5ビューコントローラーからモーダルでそれらを提示しています。新しいショーセグの代わりに廃止されたプッシュセグを使用しているとき、すべて正常に動作します! –

+0

あなたは何か間違っている。 – nhgrif

+0

私は私の質問を編集して、廃止予定のプッシュセグを使用しても4つのView Controllerを超えて期待どおりに動作していることを示しました。 唯一の問題は、ストーリーボードのショーセグが機能していないことです。だから、これはUINavigationControllerの問題ではないかもしれませんが、ストーリーボードではsegueを表示します。 唯一の解決策は、廃止予定のプッシュセグを使用するか、またはデモンストレーションのとおり、新しいView Controllerをプログラムでインスタンス化することです。 –

関連する問題