【问题标题】:performSegueWithIdentifier is being skipped *SWIFTperformSegueWithIdentifier 被跳过 *SWIFT
【发布时间】:2023-03-29 00:21:01
【问题描述】:

我有一个 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,但仍不继续。

标签: ios xcode swift segue


【解决方案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】:

    没有更多信息很难说。

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

    2. 您是否将视图控制器嵌入到 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        相关资源
        最近更新 更多