我有一个带有容器视图的视图控制器,其中嵌入了一个标签栏控制器。我正在使用它来显示3个不同的视图控制器,基于在主vc中的分段控件按下的内容。我一直在遵循这个解决方案:https://stackoverflow.com/a/38283669/11536234
我的问题是,当我更改分段控制索引(通过按下不同的段)时,我不知道如何“到达”准备函数。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print("prepare reached")
//super.prepare(for: segue, sender: sender)
//switch(segue.identifier ?? "") {
//case "TabBar":
guard let TabController = segue.destination as? UITabBarController else {
fatalError("Unexpected destination: \(segue.destination)")
}
TabController.selectedIndex = toggle.selectedSegmentIndex
//default:
//fatalError("Unexpected Segue Identifier; \(segue.identifier)")
//}
}
@IBAction func toggleAction(_ sender: UISegmentedControl) {
print("toggle is now at index: ", toggle.selectedSegmentIndex)
//performSegue(withIdentifier: "TabBar", sender: sender)
//container.bringSubview(toFront: views[sender.selectedSegmentIndex])
}
到目前为止,我已经尝试在链接到分段控件的操作函数中放置一个性能分段函数。然而,这并不起作用,因为它本质上是以编程方式添加另一个嵌入式选项卡栏,或者再次调用嵌入段,并且我收到这个错误语句:“容器视图中有意想不到的子视图。也许嵌入段已经触发了一次,或者以编程方式添加了一个子视图?”
*注释代码行是为了显示我尝试过的不起作用的代码行与我所处的位置。
发布于 2019-05-22 11:26:11
当您从另一个视图控制器( MainVC )将视图控制器嵌入到容器视图中时,仅在加载MainVC时执行一次分段。要将值传递给嵌入式UIViewController/UITabBarController,您需要获取child视图控制器并发送数据
class MainVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func segmentControlAction(_ sender: UISegmentedControl) {
if let tabBarVC = self.children.first(where: { $0 is UITabBarController }) as? UITabBarController {
tabBarVC.selectedIndex = sender.selectedSegmentIndex
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//called before mainvc viewDidLoad
let destinationVC = segue.destination as? UITabBarController
destinationVC?.selectedIndex = 1
}
}
发布于 2019-05-22 05:59:27
你不能做你想做的事。
使用嵌入序列时,当主机视图控制器第一次加载时将触发段。这将在加载嵌入式视图控制器的视图之前调用您的prepare(for:sender)
方法一次且仅一次。它不会再被调用。
你需要做的是在一个实例变量中保存一个指向你的子视图控制器的指针。定义父级用来与子级通信的协议,然后在用户选择分段控件中的不同段时,使用该协议向子级发送消息。
然后,该子对象(可能是选项卡栏控制器)可以根据您定义的消息切换所选的选项卡。
https://stackoverflow.com/questions/56246814
复制相似问题