来自 viewDidAppear 的 Segue 调用有效,但不是来自 viewWillAppear

Posted

技术标签:

【中文标题】来自 viewDidAppear 的 Segue 调用有效,但不是来自 viewWillAppear【英文标题】:Segue call from viewDidAppear works, but not from viewWillAppear 【发布时间】:2016-05-27 23:16:07 【问题描述】:

在给定的环境下,我有以下场景:

Xcode v7.3.1 斯威夫特 2

在登录 viewController 中,如果用户已经登录,我最初在 viewWillAppear 方法中进行了以下 segue 调用以绕过登录屏幕:

  override func viewWillAppear(animated: Bool) 
    if PFUser.currentUser() != nil 
      self.performSegueWithIdentifier("login", sender: self)
    
  

segue 没有工作,所以我在进行 segue 调用的地方设置了一个断点,并验证它确实被命中了。我还单步执行了调用并验证没有抛出异常,但由于某种原因没有执行 segue。

但是,我在 viewDidAppear 方法中进行了相同的调用:

  override func viewDidAppear(animated: Bool) 
    if PFUser.currentUser() != nil 
      self.performSegueWithIdentifier("login", sender: self)
    
  

再次,我验证了 segue 调用正在被命中,但在这种情况下,segue 实际执行了。所以我想知道为什么完全相同的调用在 viewWillAppear 方法中调用时不起作用,但在 viewDidAppear 中却按预期工作。最令人费解的部分是似乎正在调用,但没有观察到预期的行为。我尝试用谷歌搜索其他遇到此问题的人,但找不到任何东西。

我想我可以忍受从 viewWillAppear 调用它,但是在被重定向之前登录屏幕的短暂外观,这有点烦人。如果有人对我如何能够从 viewWillAppear 中使其工作有解决方案或建议,我将不胜感激。

【问题讨论】:

我建议您的默认演示文稿是“登录”场景,并在需要时以模态方式显示登录场景 【参考方案1】:

您不能在viewWillAppear 方法中执行转场。这是因为视图还没有完全出现,它不能转换到另一个视图。在这种情况下,如果不应该执行 segue,我将有一个加载图像或类似的东西并让它消失。当然,这将在 viewDidAppear 方法中完成。

【讨论】:

好吧,我想可能是这样的。感谢您的信息和推荐。 @djilo 没问题!

以上是关于来自 viewDidAppear 的 Segue 调用有效,但不是来自 viewWillAppear的主要内容,如果未能解决你的问题,请参考以下文章

UITableView显示和重新加载行为不同步

如何延迟执行 Segue

为啥后台和重新打开应用程序不调用 viewDidAppear?

从 viewDidAppear 呈现时,模态弹出框控制器不显示其内容

Swift:以编程方式枚举来自 UIVIewController 的传出 segue

来自一个视图控制器的两个segue,prepareForSegue