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

How to get to a tab bar from the embedded view?

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

在空视图和包含数据的视图上,我有一个按钮应该 "click" 选项卡栏上的按钮之一(切换到另一个选项卡)。

现在我正在做的是:

正在显示包含数据的视图:

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 "parents"。

一定有更好的方法... 我的架构错了吗?如果我不知道途中有多少视图,如何从嵌入式视图进入标签栏?

A ViewController 已经有一个 属性 tabBarController 描述为

// If the view controller has a tab bar controller as its ancestor, return it. Returns nil otherwise.

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

self.tabBarController?.selectedIndex = 2