일반적으로 각 탭의 위임자로 사용자 정의 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
는 한 tabBar 참조 를 개최합니다 - 그것은 기존의 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
액세스하고 제시하기 전에 그것을 기준을 수득 SEGUE 방법 준비 용도.
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 어떻게 tabroll에 viewController를 추가하고 있습니까? – Wez
내 tabBar를 설정하는 방법은 원래 기본 (2 탭)을 사용하는 것입니다. 그런 다음 세 번째보기 컨트롤러에 연결되는 하단에 tabBarItem을 추가했습니다. 이 질문에 대한 대답이 있습니까? 더 많은 정보가 필요하시면 제공 해줘서 기쁩니다! – Kevin