こんにちは私はAとBの両方から表示できる共通のビューCを持っています。ビューCのナビゲーションバーの色をそれが提示された。 CがViewから提示されたとしたら、ナビゲーションバーを緑色にしたいと思います.CがView Bから提示されたら、View Cのナビゲーションバーを赤色にしたいと思います。私はどのようにそれを行うことができるか把握することができません。Swiftでどのビューコントローラから来たものかを特定する方法
誰かが私に私が.....あなたのCビューコントローラで事前
こんにちは私はAとBの両方から表示できる共通のビューCを持っています。ビューCのナビゲーションバーの色をそれが提示された。 CがViewから提示されたとしたら、ナビゲーションバーを緑色にしたいと思います.CがView Bから提示されたら、View Cのナビゲーションバーを赤色にしたいと思います。私はどのようにそれを行うことができるか把握することができません。Swiftでどのビューコントローラから来たものかを特定する方法
誰かが私に私が.....あなたのCビューコントローラで事前
で
おかげで直面しています問題の解決策を与えることができ、 は、ナビゲーションスタック内のすべてのビューコントローラを取得します。 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
}
あなたはこのことで操作を行う必要があるコード
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")
}
に従うことによってそれを確認することができますプッシュビューコントローラーにプロパティを追加して設定します。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
により、たとえば、このために列挙型を持つことができるである
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の色を変更します。
ナビゲーションコントローラからスタックしてAまたはBを確認 –
C inn'prepareForSegue'にプロパティを設定するか、Cを押します。 – Paulw11
質問には非常に多くの悪いことがあります。ナビゲーションコントローラの色。外部に設定する必要があります。 – Sulthan