2017-12-11 19 views
1

5 개의 탭 표시 줄 항목으로 스토리 보드에 탭 표시 줄 컨트롤러를 만들었습니다. 탭 막대 스택의 "viewcontrollers"배열에서 프로그래밍 방식으로 하나의보기 컨트롤러를 제거하고 싶습니다. 또한 위의보기 컨트롤러를 제거 할 때 선택한 다른 탭 항목을 표시하도록 앱을 원합니다. 아래 코드를 시도했지만 작동하지 않습니다.프로그래밍 방식으로 탭 컨트롤러에서보기 컨트롤러를 언로드하려면 어떻게해야합니까?

if let tabBarController = self.storyboard?.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController { 
    tabBarController.viewControllers?.remove(at: 2) 
    tabBarController.selectedIndex = 1 
} 
+0

당신이 제거 할 하나의 부족 viewControllers의 새로운 배열을 asigning 시도? –

+0

@ MilanNosáľ 아니, 방금 배열에서보기 컨트롤러를 제거했습니다. 그것을 시도 할 것입니다. – subin272

+0

@ MilanNosáľ View Controller가 제거 되더라도 작동하지 않습니다. – subin272

답변

1

재 할당 viewControllers 속성이 원하지 않는 :

if let tabBarController = self.storyboard?.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController { 
    tabBarController.selectedIndex = 1 
    var controllers = tabBarController.viewControllers 
    controllers.remove(at: 2) 
    tabBarController.viewControllers = controllers 
} 

지금이 코드는 괜찮습니다,하지만 문제는 다음 줄 수 있습니다 :

let tabBarController = self.storyboard?.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController 

이로 인해 새로운 UITabBarController 인스턴스가 생성되지만 storyboads에 의해 인스턴스화되어 화면에 표시되는 인스턴스에 액세스하려고합니다. 그러나 컨텍스트가 없으면 액세스 방법에 대한 제안을하기가 어렵습니다. 직접 탭 표시 줄 컨트롤러에 내장 된의 ViewController에서이 코드를 호출 점을 감안하면,이로 시작하는 것입니다 :

if let tabBarController = self.tabBarController { 
    tabBarController.selectedIndex = 1 
    var controllers = tabBarController.viewControllers 
    controllers.remove(at: 2) 
    tabBarController.viewControllers = controllers 
} 
+0

"instantiateViewController"줄에 문제가 있습니다. 이 메서드는 실제로 뷰 컨트롤러의 새 인스턴스를 만듭니다. – subin272

1

이 시도 : 하나없이

if let tabBarController = self.storyboard?.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController { 
     var viewControllers = tabBarController.viewControllers 
     viewControllers.remove(at: 2) 
     tabBarController.viewControllers = viewControllers 
     tabBarController.selectedIndex = 1 
    } 
+0

디버거를 체크인 할 때 뷰 컨트롤러가 "viewControllers"배열에서 제거되는 것을 볼 수 있습니다. 그러나 응용 프로그램에서 여전히보기 컨트롤러를 표시하고 "viewDidLoad"가 다시 호출되지 않습니다. – subin272

0
if let tabBarController = self.tabBarController { 

    let indexToRemove = 3 

    if indexToRemove < tabBarController.viewControllers?.count { 

     var viewControllers = tabBarController.viewControllers 

     viewControllers?.remove(at: indexToRemove) 

     tabBarController.viewControllers = viewControllers 
    } 
} 
+0

디버거를 체크인 할 때 뷰 컨트롤러가 "viewControllers"배열에서 제거되는 것을 볼 수 있습니다. 그러나 응용 프로그램에서 여전히보기 컨트롤러를 표시하고 "viewDidLoad"가 다시 호출되지 않습니다. – subin272