如何从嵌入式视图进入标签栏?

时间:2019-04-10 12:46:32

标签: swift uitabbarcontroller navigationcontroller

我的应用程序中有一个带有4个选项卡的选项卡栏控制器。其中之一应该根据API的响应显示2个场景之一:如果没有数据,则显示为空白视图;如果有数据,则显示为分段控件。 以下是具有设置的情节提要:

Tab bar storyboard Views storyboard

在空视图和带有数据的视图上,我都有一个按钮,应“单击”选项卡栏上的按钮之一(切换到另一个选项卡)。

现在这就是我正在做的:

显示包含数据的视图:

class EmptyTasksVC: ViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        if(there_is_data){
            let storyboard = UIStoryboard(name: "TaskTodoList", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "TaskListSegmentedControl")

            let childNavigation = UINavigationController(rootViewController: vc)
            childNavigation.willMove(toParent: self)
            addChild(childNavigation)
            childNavigation.view.frame = view.frame
            view.addSubview(childNavigation.view)
            childNavigation.didMove(toParent: self)
         }
    }
}

在具有数据的视图中找到按钮单击时的标签栏:

@objc func newTaskAction(sender: UIButton!) {
    let viewController = self.findViewController()
    let tabBar = viewController?.parent?.parent?.parent?.parent?.parent as! UITabBarController
    tabBar.selectedIndex = 2
}
...

extension UIView {
    func findViewController() -> UIViewController? {
        if let nextResponder = self.next as? UIViewController {
            return nextResponder
        } else if let nextResponder = self.next as? UIView {
            return nextResponder.findViewController()
        } else {
            return nil
        }
    }
}

如果我想从空白视图进入按钮,则必须从链中删除2个“父母”。

一定有更好的方法来做... 我的架构错了吗?如果我不知道正在路上有多少个视图,如何从嵌入式视图转到选项卡栏?

1 个答案:

答案 0 :(得分:1)

ViewController已经具有属性tabBarController,其描述为

  

//如果视图控制器将标签栏控制器作为其祖先,   把它返还。否则返回nil。

因此您可以直接访问您的viewController嵌入的TabBar Controller

self.tabBarController?.selectedIndex = 2