首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法“到达”我的覆盖准备函数,无法以编程方式更改标签栏控制器中的视图

无法“到达”我的覆盖准备函数,无法以编程方式更改标签栏控制器中的视图
EN

Stack Overflow用户
提问于 2019-05-22 05:51:46
回答 2查看 41关注 0票数 1

我有一个带有容器视图的视图控制器,其中嵌入了一个标签栏控制器。我正在使用它来显示3个不同的视图控制器,基于在主vc中的分段控件按下的内容。我一直在遵循这个解决方案:https://stackoverflow.com/a/38283669/11536234

我的问题是,当我更改分段控制索引(通过按下不同的段)时,我不知道如何“到达”准备函数。

代码语言:javascript
复制
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])
}

到目前为止,我已经尝试在链接到分段控件的操作函数中放置一个性能分段函数。然而,这并不起作用,因为它本质上是以编程方式添加另一个嵌入式选项卡栏,或者再次调用嵌入段,并且我收到这个错误语句:“容器视图中有意想不到的子视图。也许嵌入段已经触发了一次,或者以编程方式添加了一个子视图?”

*注释代码行是为了显示我尝试过的不起作用的代码行与我所处的位置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-22 11:26:11

当您从另一个视图控制器( MainVC )将视图控制器嵌入到容器视图中时,仅在加载MainVC时执行一次分段。要将值传递给嵌入式UIViewController/UITabBarController,您需要获取child视图控制器并发送数据

代码语言:javascript
复制
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
    }
}

票数 0
EN

Stack Overflow用户

发布于 2019-05-22 05:59:27

你不能做你想做的事。

使用嵌入序列时,当主机视图控制器第一次加载时将触发段。这将在加载嵌入式视图控制器的视图之前调用您的prepare(for:sender)方法一次且仅一次。它不会再被调用。

你需要做的是在一个实例变量中保存一个指向你的子视图控制器的指针。定义父级用来与子级通信的协议,然后在用户选择分段控件中的不同段时,使用该协议向子级发送消息。

然后,该子对象(可能是选项卡栏控制器)可以根据您定义的消息切换所选的选项卡。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56246814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档