私は通常、各タブの代理人としてカスタムtabBarController
でこれを行いますが、私はスタック内のviewControllers
にアクセスするあなたの方法がとても好きです。あなたのバージョンに何が間違っているのかを見てみましょう。
これはいただきました!あなたのコードでアップ私たちは、デバッグに役立つかもしれない。この
if let tC = self.tabBarController {
if let vcs = tC.viewControllers {
if let map = vcs[1] as? MapVC {
print("map vc found in stack")
map.loadViewIfNeeded()
map.add(newLocation:location_one)
} else {
print("no map vc found at index 1")
}
} else {
print("no stack found")
}
} else {
print("no tab bar found")
}
ようにそれを実行してみてください、あなたはそれがnil
を返しているmapVC
だと確信していますか?
編集:あなたはコメントで説明したように、あなたが離れてtabBarController
からsegueingされている場合、新たに提示のViewControllerのtabBarController
プロパティがApple Docsごとのようにゼロになります。
このプロパティは、ビューコントローラがタブバーコントローラ内に埋め込まれていない場合はnilです。
一つの解決策は、この図の通りvc2
からvc3
にtabBarController
の参照を渡すことであろう。
[tabBarController]
| |
[vc1] [vc2] - both have a reference to tabBarController
|
[vc3] - no reference yet
セットアップvc3
は、タブバーの参照 を保持する - それは、既存のtabBarController
プロパティを使用するのではなく、このための新たなVARを作成するために、おそらく最高です。
class vc3:UIViewController {
var tabBarReference:UITabBarController?
func addALocation(location:CLLocationCoordinate2D) {
if let tbc = self.tabBarReference {
if let map = tbc.viewControllers[1] as? MapVC {
map.loadViewIfNeeded()
map.add(newLocation:location)
}
}
}
}
そしてvc2
内部vc3
にアクセスし、それが提示される前に参照を与えるためにセグエ方法の準備使用。
class vc2:UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc3 = segue.destinationViewController as? vc3
vc3.tabBarReference = self.tabBarController
}
}
func goToVC3() {
self.performSegueWithIdentifier("goToVC3", sender: nil)
}
}
私はこのコードをテストしていませんが、それは私はあなたが乗る方法を知ってみましょう、理論的には動作するはずです。
出典
2017-01-20 18:45:28
Wez
私はこれを私のコードに実装し、 "タブバーが見つかりません"を返しました。これは私が問題だと思ったものですが、私のビューコントローラはtabBarControllerで構造化されているので、むしろ奇妙です。何が起きているか知っていますか? – Kevin
@ KevinどのようにタブバーにviewControllerを追加していますか? – Wez
私がtabBarを設定する方法は、もともとデフォルト(2つのタブ)を使用してから、3番目のView ControllerにセグメントしたtabBarItemを最後に追加しました。これはあなたの質問に答えますか?もっと情報が必要な場合は、私はそれを提供して喜んで! – Kevin