Swift Segue - 不建议在分离的视图控制器上呈现视图控制器

3

当selectedCityId为0(未定义)时,我希望打开“选择城市”控制器以选择城市。在我的根视图控制器(MainVC)的viewDidLoad()方法中:

let selectedCityId = NSUserDefaults.standardUserDefaults().integerForKey("selectedCityId")

    if(selectedCityId == 0){
        self.performSegueWithIdentifier("startupSegue", sender: self)
    } else {
        ....
    }

因此,startupSegue以模态方式打开SettingsViewController(SettingsVC)!MainVC和SettingsVC都嵌入在导航视图控制器中。

有2个警告:

在分离的视图控制器上呈现视图控制器是不推荐的 "myapp.MainVC: 0x7fee8871e670"。

对于“UINavigationController: 0x7fee8872c950”,调用开始/结束外观转换不平衡。

感谢您的回答。


尝试在Storyboard中将segue设置为不进行动画。因为我假设你是想在应用启动时立即呈现selectedCityVC,所以你正在viewDidLoad中执行此操作? - DBoyer
是的,但它解决了问题吗? - mazy
你的VC还没有准备好执行segues。它的视图已经加载(viewDidLoad),但还没有落在视图层次结构中。 - Graham Perks
2个回答

5

我曾经遇到过同样的警告,将代码移到-viewDidAppear中解决了问题。需要注意的一件事是,-viewDidLoad仅在第一次加载页面时调用,而如果页面再次变为可见状态,则可能会多次调用-viewDidAppear,因此您需要添加额外的机制来跳过再次执行segue。


2
将代码移动到-viewDidAppear是个好主意,但我建议您也应该从主线程执行segue调用:
dispatch_async(dispatch_get_main_queue(), { () -> Void in
  self.performSegueWithIdentifier("startupSegue", sender: self)
})

Swift 3

DispatchQueue.main.async
  {
    self.performSegue(withIdentifier: "startupSegue", sender: self)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接