我的应用程序中有一个标签栏控制器,有4个标签。其中一个应该根据API的响应显示2个场景中的一个:如果没有数据则为空视图;如果有数据则为分段控件。以下是设置的故事板:
在空视图和带有数据的视图上,我都有一个按钮,可以“单击”选项卡栏上的一个按钮(切换到另一个选项卡)。
现在这就是我正在做的事情:
显示包含数据的视图:
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个“父母”。
必须有一个更好的方法来做到这一点......我的架构是错的吗?如果我不知道有多少视图,我如何从嵌入视图进入标签栏?
一个ViewController
已经有一个属性tabBarController
描述为
//如果视图控制器有一个标签栏控制器作为其祖先,请将其返回。否则返回nil。
所以你可以直接访问你的viewController嵌入的TabBar
Controller
,
self.tabBarController?.selectedIndex = 2