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】:
您应该将代码移动到viewWillAppear
或viewDidAppear
方法中。
那么它应该可以正常使用。
但是现在视图闪烁了很短的时间。要消除闪烁,只需在 viewWillApear
方法中隐藏视图即可:
self.view.hidden = true
此外,viewDidLoad
方法不会在每次视图出现时被调用,而只会在它第一次加载时被调用。例如,如果您执行 segue 并返回视图,它不会再次加载,而只会再次调用 viewWillAppear
和 viewDidAppear
。
【讨论】:
谢谢。我明白那个。我的烦恼是,当调用 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 调用的方法缓慢显示视图