准备(for:sender :)在从按钮到标签栏控制器的segue期间不被调用(在Swift 4,Xcode 9中)

时间:2017-09-27 17:33:46

标签: swift uibutton uitabbarcontroller prepared-statement segue

我正在编写一个带有两个标签的应用。在第一个选项卡中,用户选择一些设置。然后,他们点击第二个选项卡,根据第一个选项卡中的设置随机绘制和显示卡片。在第二个标签的视图底部,有一个重新洗牌按钮。我有一个按钮segue' d到(自定义)UITabBarViewController,带有一个重写的prepare(for:sender :)函数,指示它立即返回第二个标签。在阅读了几个完全相同的问题之后,我确定我已经完成了所有的事情,根据所有的答案,它应该工作。

但是,它只会转到第一个标签。我可以再次点击第二个标签,进行重新洗牌,并正确显示一组新卡片,这样就没问题了。但是,无论何时单击重新洗牌按钮,都不会调用prepare(),因此它会转到第一个选项卡而不是第二个选项卡。为什么不调用prepare()?

这里有我的内容,故事板和代码:

storyboard

class MainTabBarViewController: UITabBarController {

// var nextViewNumber = Int()

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "reshuffleSegue") {
        if let tabVC = segue.destination as? UITabBarController {
            tabVC.selectedIndex = 2
        }
    }
}
}

编辑添加:如果有另一种方法可以达到预期的效果,我很乐意使用它。

1 个答案:

答案 0 :(得分:0)

您已将prepare(for:)方法的实现放在错误的类中。它位于源视图控制器中,它是Draw Cards视图控制器 - 而不是标签栏视图控制器。

但是,您还应该注意到,故事板中有一个灾难性的segue循环:您有从Draw Cards到Main Tab Bar的show segue,以及从Main Tab Bar到Draw Cards的父子关系。你的应用程序注定失败。你应该完全重新思考你的架构。