【问题标题】:ViewDidLoad calling again after segue performed执行 segue 后再次调用 ViewDidLoad
【发布时间】:2016-03-04 06:00:42
【问题描述】:

我在转回主视图控制器时遇到异常错误。

当用户在应用程序中注册时,它会创建一个唯一的 CloudKit 记录。保存操作完成后,会从 cloudKit saveRecord 闭包中广播 NSNotification,该闭包会向用户显示警报。当接受警报时,将执行对新 viewController 的 segue。

当返回主视图控制器时,它会再次运行 viewDidLoad 和 viewDidAppear,导致各种功能停止工作。我发现我的主视图控制器的原始实例仍在内存中,可以访问。

我相信这个问题可能与线程和 performForSegue 被从主线程中调用有关,尽管我使用的是 GCD,但情况并非如此。

这是我的代码:

保存功能:

func saveRecord(newUser: CKRecord) {

database.saveRecord(newUser) { record, error in

  if error != nil {

    print(error)
    Properties.registrationError = error

  } else {

    Properties.registrationSuccess = record
    print(record)
  }

    NSNotificationCenter.defaultCenter().postNotificationName(Key.Registration, object: self)
 }
}

当收到 saveRecord 通知时:

func registrationComplete() {
 dispatch_async(dispatch_get_main_queue()) {

  self.pleaseWait.alpha = 0
  self.stopIndicator()
  print("stop indicator")

  if Properties.registrationError != nil {

    self.displayAlert("Registration Failed", error: "\(Properties.registrationError!.localizedDescription)", performAction: .None)

  } else {

    self.displayAlert("Registration Completed", error: "Press OK to begin induction", performAction: .BeginInduction)
  }
 }
}

按下确定时:

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

为了测试,当新视图出现时,我将直接返回主控制器。此时原控制器的 viewDidLoad 再次运行。任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: ios swift segue


    【解决方案1】:

    当您调用performSegueWithIdentifier 时,它将加载与“beginInduction”标识符关联的新视图控制器,并且不会返回到您可能使用先前的performSegueWithIdentifier 创建的现有实例。你需要做的是使用 unwind segue。

    更多细节在这个链接中。

    https://developer.apple.com/library/ios/technotes/tn2298/_index.html

    或者,您可以使用 popToRootViewControllerAnimatedpopToViewControllerpopViewControllerdismissViewController 方法返回到可渗透的视图控制器

    【讨论】:

    • 谢谢,我会调查的。与其他方法相比,您是否更喜欢或推荐一种方法作为最佳实践?
    • 这取决于您如何查看控制器层次结构。如果您正在使用导航控制器并且您的主控制器是根视图控制器,那么您可以使用popToRootViewController。否则,如果主控制器顶部的视图控制器显示为模态视图控制器,则可以使用 dismissViewController
    • 好的,谢谢,我没有使用导航控制器,在访问其他三个控制器之前,我不需要转到主控制器。我刚刚按照您的指示进行操作,展开效果很好。干杯:)
    猜你喜欢
    • 2017-12-06
    • 2012-01-03
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多