2017-03-06 1 views
1

こんにちは私はAとBの両方から表示できる共通のビューCを持っています。ビューCのナビゲーションバーの色をそれが提示された。 CがViewから提示されたとしたら、ナビゲーションバーを緑色にしたいと思います.CがView Bから提示されたら、View Cのナビゲーションバーを赤色にしたいと思います。私はどのようにそれを行うことができるか把握することができません。Swiftでどのビューコントローラから来たものかを特定する方法

誰かが私に私が.....あなたのCビューコントローラで事前

+0

ナビゲーションコントローラからスタックしてAまたはBを確認 –

+1

C inn'prepareForSegue'にプロパティを設定するか、Cを押します。 – Paulw11

+0

質問には非常に多くの悪いことがあります。ナビゲーションコントローラの色。外部に設定する必要があります。 – Sulthan

答えて

0

おかげで直面しています問題の解決策を与えることができ、 は、ナビゲーションスタック内のすべてのビューコントローラを取得します。 AまたはBのタイプの

let controllers = self.navigationController.viewControllers 

この配列の2番目の最後のオブジェクトを検索し、チェック

if controllers.count > 1, let expectedController = controllers[controllers.count-2] as? A { 
// Your last controller was A type 
} 
0

あなたはこのことで操作を行う必要があるコード

if let controllerA = self.navigationController?.presentingViewController as? ControllerA { 
    print("arrived from controllerA") 
} else if let controllerB = self.navigationController?.presentingViewController as? ControllerB { 
    print("arrived from controllerB") 
} 
4

に従うことによってそれを確認することができますプッシュビューコントローラーにプロパティを追加して設定します。prepare(for segue:)

このように、ViewControllerCは、どのビューコントローラがそれを提示したかについて何の知識も必要としません。つまり、コードを変更することなく、表示方法を変更できます(navスタックにプッシュされるのではなく、モーダルでViewControllerZでプッシュされます)。 ViewControllerC

その後
var navBarColor: UIColor? 

override func viewWillAppear(_ animated: Bool) { 
    super viewWillAppear(animated) 

    navigationController?.navigationBar.barTintColor = navBarColor 
} 

ViewControllerA中:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let vcc = segue.destination as? ViewControllerC { 
     vcc.navBarColor = .green 
    } 
} 
...と ViewControllerBで:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let vcc = segue.destination as? ViewControllerC { 
     vcc.navBarColor = .red 
    } 
} 

エクストラクレジット

.green.redを使用してさまざまな「状態」を表す場合、プロパティがその状態を表すのがより便利な場合があります。例として...私が推薦する何

enum StoreState { 
    case buying, selling, browsing 

    var navBarColor: UIColor { 
     switch self { 
     case buying: return .green 
     case selling: return .red 
     case browsing: return .blue 
    } 
} 

var storeState: StoreState? 

navigationController?.navigationBar.barTintColor = storeState?.navBarColor 
0

により、たとえば、このために列挙型を持つことができるである

enum transitionType { 
    case first 
    case second 
} 

そしてちょうど例

のためのこの列挙のためのViewController「C」で変数を作成します
var pushedFrom = transitionType.first 

これは、ビューコントローラCのオブジェクトをプッシュまたはプレゼンテーションする前に作成するときに、その "pushedFrom"変数に正しい値を指定するだけですトローラA、

secondViewController.pushedFrom = .first 

とのViewController Bであれば、

secondViewController.pushedFrom = .second 

は、その後のviewDidLoadのViewControllerの "C" で、あなたはpushedfrom変数が保持しているどのようなケースをチェックすることができ、それに応じnavigationcontrollerの色を変更します。

関連する問題