performSegueWithIdentifier 被跳过 *SWIFT

Posted

技术标签:

【中文标题】performSegueWithIdentifier 被跳过 *SWIFT【英文标题】:performSegueWithIdentifier is being skipped *SWIFT 【发布时间】:2015-02-17 22:29:26 【问题描述】:

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

override func viewDidLoad() 
        super.viewDidLoad()

        if user == nil 

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

        

知道为什么吗?

【问题讨论】:

您是否使用 nsuserdefaults 来存储用户凭据? 也许可以试试dispatch_async(dispatch_get_main_queue(), self.performSegueWithIdentifier("LoginSegue", sender: self) ) 也确保你的 shouldPerformSegue 没有返回 false。 Texas = 不,我正在使用 Parse。 boidkan = 返回 true,但仍不继续。 【参考方案1】:

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

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

self.view.hidden = true

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

【讨论】:

谢谢。我明白那个。我的烦恼是,当调用 viewWillAppear 或 viewDidAppear 时,主 TableVC 会出现一会儿,然后转到登录屏幕。如果用户为零,我宁愿它只是进入登录屏幕。有什么办法可以避免主VC的闪烁? 我已经编辑了我的答案。只需将 self.view.hidden = true 添加到您的 viewWillApear 方法即可解决该问题。 我怀疑我还没有发现问题。当我在代码中添加断点时,我看到它通过 if 语句,通读 perfromsegue 函数,然后继续向下翻页,就好像 perfromsegue 函数不存在一样。不管方法是在 viewWillAppear 还是 viewDidAppear 还是 viewDidLoad 对不起。我不清楚。我已经读过它作为一种可能的解决方案,人们提到它会做到这一点。所以我尝试了同样的问题。它直接覆盖了方法并停留在主 VC 上。这个 TableViewController 中嵌入了一个导航控制器,也就是初始视图。这和它有关系吗? 对不起。目前我不知道任何可能的问题,这可能会导致您的错误。令人怀疑的是,它在没有调用 segue 的情况下运行您的代码。也许segue设置不正确并且指向无处?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

没有更多信息很难说。

    您是否有按钮或已建立转场的东西,并且您是否提供了转场的标识符?我在 viewDidLoad 中进行了类似的调用,并且成功了。

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

【讨论】:

【参考方案4】:
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 提供一个 ID,例如 ViewControllerClassId

【讨论】:

以上是关于performSegueWithIdentifier 被跳过 *SWIFT的主要内容,如果未能解决你的问题,请参考以下文章

performSegueWithIdentifier 出现运行时错误,为啥?

iOS8 performSegueWithIdentifier 运行太慢

performSegueWithIdentifier:sender: 找不到我的转场

unwind segue / performSegueWithIdentifier: 问题

performSegueWithIdentifier 不起作用

performSegueWithIdentifier:从 didSelectRowAtIIndexPath 调用的方法缓慢显示视图