Как управлять состояниями между ViewControllers в Swift? - PullRequest
0 голосов
/ 07 июля 2019

Я изо всех сил пытаюсь решить проблему, которая, по моему мнению, является проблемой состояния между ViewControllers.

Путь навигации следующий;

1.Пользователь переходит от 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. Затем пользователь может перейти от 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. Затем пользователь возвращается к DiscoverVC из PreferencesVC, передавая тот же Venue объект

@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()
    }

}

ПРОБЛЕМА: Является ли объект Venue внутри DiscoverVC нулевым, даже если он был передан обратно из PreferencesVC на третьем шаге выше ??

Вот вывод консоли:

enter image description here

1 Ответ

0 голосов
/ 07 июля 2019

Когда вы делаете это:

@IBAction func doneBtnTapped(_ sender: Any) {

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

    discoverVC.venue = self.selectedVenue!

Вы не устанавливаете venue виртуального виртуального канала Discover, в котором представлен виртуальный виртуальный канал Preferences. Вы устанавливаете venue для нового Discover VC.

Вы можете использовать шаблон делегата для передачи venue обратно.

Создать PreferencesVCDelegate:

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

Добавить свойство delegate в PreferencesVC:

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. Здесь вы можете открыть для себя ВК venue

extension DiscoverVC: PreferencesVCDelegate {
    func preferencesVC(_ vc: PreferencesVC, didDismissWithVenue venue: Venue) {
        self.venue = venue
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...