如何在 Swift 中管理 ViewController 之间的状态?

How to manage States between ViewControllers in Swift?

我正在努力解决我认为是 ViewController 之间的状态问题。

导航路径如下;

1.User 从 VenueDetailsVC 导航到 DiscoverVC 并传递一个 Venue 对象:

func presentDiscoverVC(){

    guard let discoverVC = storyboard?.instantiateViewController(withIdentifier: "DiscoverVC") as? DiscoverVC else { return }

    discoverVC.venue = self.venue!
    discoverVC.showBackButton = true

    DispatchQueue.main.async {
        self.presentDetail(discoverVC)
    }

}

2.User 然后可以从 DiscoverVC 导航到 PreferencesVC 并传递相同的 Venue 对象,同时清除本地 Venue 对象:

class DiscoverVC: UIViewController{

    var venue: Venue?{
        didSet{
            print("DiscoverVC venue name: \(venue?.name ?? "venue name")")
        }
    }

    @IBAction func preferencesBtnTapped(_ sender: Any) {

        guard let preferencesVC = storyboard?.instantiateViewController(withIdentifier: "PreferencesVC") as? PreferencesVC else { return }

        preferencesVC.selectedVenue = self.venue!

        presentDetail(preferencesVC)

    }

    override func viewWillAppear(_ animated: Bool) {

            print("inside viewWillAppear venue: \(venue?.name ?? "venue name")")

    }


    override func viewWillDisappear(_ animated: Bool) {

        venue = nil

    }
}

3.User 然后通过相同的 Venue 对象

PreferencesVC 导航回 DiscoverVC
@IBAction func doneBtnTapped(_ sender: Any) {

    guard let discoverVC = storyboard?.instantiateViewController(withIdentifier: "DiscoverVC") as? DiscoverVC else { return }

    discoverVC.venue = self.selectedVenue!

    DataService.run.updateUserDiscoveryPreferences(forUID: Auth.auth().currentUser!.uid, discoverableBool: discoverable!, preferences: preferences) { (success) in

        self.dismissDetail()
    }

}

问题:DiscoverVC 中的 Venue 对象是否为零,即使它已在上面的第三步从 PreferencesVC 传回??

控制台输出如下:

当你这样做时:

@IBAction func doneBtnTapped(_ sender: Any) {

    guard let discoverVC = storyboard?.instantiateViewController(withIdentifier: "DiscoverVC") as? DiscoverVC else { return }

    discoverVC.venue = self.selectedVenue!

您没有设置显示首选项 VC 的 Discover VC 的 venue。您正在设置 全新 Discover VC.

venue

您可以使用委托模式将 venue 传回。

创建 PreferencesVCDelegate:

protocol PreferencesVCDelegate: class {
    func preferencesVC(_ vc: PreferencesVC, didDismissWithVenue venue: Venue)
}

PreferencesVC中添加一个delegate属性:

weak var delegate: PreferencesVCDelegate?

将设置 venue 的行替换为对委托方法的调用:

@IBAction func doneBtnTapped(_ sender: Any) {

    guard let discoverVC = storyboard?.instantiateViewController(withIdentifier: "DiscoverVC") as? DiscoverVC else { return }

    delegate?.preferencesVC(self, didDismissWithVenue: self.venue)

当您展示PreferencesVC时,将self设置为代表:

@IBAction func preferencesBtnTapped(_ sender: Any) {

    guard let preferencesVC = storyboard?.instantiateViewController(withIdentifier: "PreferencesVC") as? PreferencesVC else { return }

    preferencesVC.selectedVenue = self.venue!
    preferencesVC.delegate = self

    presentDetail(preferencesVC)

}

并使DiscoverVC符合PreferencesVCDelegate。这是你设置 discover VC's venue

的地方
extension DiscoverVC: PreferencesVCDelegate {
    func preferencesVC(_ vc: PreferencesVC, didDismissWithVenue venue: Venue) {
        self.venue = venue
    }
}