我有一个UITableViewController,我希望人们可以访问它作为主页面。我有一个登录视图控制器,但我不希望这是我的初始视图控制器。我有一个if语句检查用户是否已经登录过。如果没有,我想对登录视图控制器执行segue。然而,当我运行应用程序时,它会通过if语句,识别出用户是== nil,然后继续执行performSegueWithIdentifier操作。
override func viewDidLoad() {
super.viewDidLoad()
if user == nil {
self.performSegueWithIdentifier("LoginSegue", sender: self)
}
}
知道为什么吗?
答案 0 :(得分:6)
您应该将代码移到viewWillAppear
或viewDidAppear
方法中。
然后应该正确使用。
但现在这个观点在短时间内闪烁。要消除这种闪烁,只需在viewWillApear
方法中隐藏视图:
self.view.hidden = true
每次出现视图时,viewDidLoad
方法都不会被调用,但只会在第一次加载时被调用。例如,如果您执行segue并返回视图,则不会再次加载,但只会再次调用viewWillAppear
和viewDidAppear
。
答案 1 :(得分:2)
对于Swift 3.0,尝试在这样的主线程上运行。
DispatchQueue.main.async {
self.performSegue(withIdentifier: "LoginSegue", sender: self)
}
答案 2 :(得分:1)
没有更多信息,很难说。
你有一个按钮或已经建立了segue的东西,你提供了segue的标识符吗?我在viewDidLoad中进行了类似的调用,但它确实有效。
您是否已将视图控制器嵌入到UINavigationController中?如果不是,则不可能执行segue。听起来你正在使用UITableViewController,它继承自UIViewController。所以这可能是个问题。
答案 3 :(得分:1)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let viewController:UIViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ViewControllerClassId") as! ViewControllerClassName
self.presentViewController(viewController, animated: true, completion: nil)
})
这段代码解决了我的问题。 使用我的代码代替 self.performSegueWithIdentifier(“LoginSegue”,sender:self) 并为目标ViewController提供一个像ViewControllerClassId
的ID