正在跳过 performSegueWithIdentifier *SWIFT

performSegueWithIdentifier is being skipped *SWIFT

我有一个 UITableViewController,我希望人们可以将其作为主页访问。我确实有一个登录视图控制器,但我不希望它成为我的初始视图控制器。我有一个 if 语句检查用户之前是否登录过。如果没有,我想对登录视图控制器执行一个 segue。但是,当我 运行 应用程序时,它通过 if 语句,识别出用户 == nil,然后直接执行 performSegueWithIdentifier 操作。

override func viewDidLoad() {
        super.viewDidLoad()

        if user == nil {

            self.performSegueWithIdentifier("LoginSegue", sender: self)

        }
}

知道为什么吗?

您应该将代码移动到 viewWillAppearviewDidAppear 方法中。 那么应该可以正常使用了。

但是现在画面闪烁了很短的时间。要消除闪烁,只需在 viewWillApear 方法中隐藏视图:

self.view.hidden = true

此外,viewDidLoad 方法不会在每次视图出现时都被调用,而只会在它第一次加载时被调用。例如,如果您执行 segue 和 return 返回视图,它不会再次加载,而只会再次调用 viewWillAppearviewDidAppear

没有更多信息很难说。

  1. 你有没有已经建立转场的按钮或其他东西,你是否提供了转场的标识符?我在 viewDidLoad 中进行了类似的调用,它起作用了。

  2. 您是否将视图控制器嵌入到 UINavigationController 中?如果不是,则无法执行 segue。听起来您正在使用继承自 UIViewController 的 UITableViewController。所以这可能是问题所在。

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", 发件人: 自己) 并为您的目的地 ViewController 提供一个 ID,例如 ViewControllerClassId

对于Swift 3.0,尝试像这样在主线程上运行。

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