Передача переменных обратно из ViewController к предыдущему, но переменные не обновляются? - PullRequest
1 голос
/ 25 марта 2020

У меня есть два контроллера представления, которые меня интересуют в передаче переменных от одного контроллера представления к другому в обратном порядке. Чтобы добиться этого, я использовал протокол, однако переменная в первом контроллере представления не обновляется при переходе от второго контроллера представления к просмотру первого контроллера:

Ниже приведен мой код для первого контроллера представления:

    import UIKit

    class BlueBookUniversalBeamsVC: UIViewController {

        var lastSelectedTableRowByTheUser: Int = 0

        var lastSelectedTableSectionByTheUser: Int = 0

    override func viewDidLoad() {

            super.viewDidLoad()

            print(lastSelectedTableRowByTheUser)

            print(lastSelectedTableSectionByTheUser)

     }

 }

    extension BlueBookUniversalBeamsVC: ProtocolToPassDataBackwardsFromDataSummaryVcToPreviousVc {

        func dataToBePassedUsingProtocol(passedSelectedTableSectionNumberFromPreviousVc: Int, passedSelectedTableRowNumberFromPreviousVc: Int) {

            self.lastSelectedTableRowByTheUser = passedSelectedTableRowNumberFromPreviousVc

            self.lastSelectedTableSectionByTheUser = passedSelectedTableSectionNumberFromPreviousVc

            print("Last selected row passed back from SummaryVC is equal to \(passedSelectedTableRowNumberFromPreviousVc)")

            print("Last selected section passed back from SummaryVC is equal to \(passedSelectedTableSectionNumberFromPreviousVc)")

    }

Ниже приведен мой код внутри контроллера второго представленияL

import UIKit

class BlueBookUniversalBeamDataSummaryVC: UIViewController {

   var delegate: ProtocolToPassDataBackwardsFromDataSummaryVcToPreviousVc?

   @objc func navigationBarLeftButtonPressed(sender : UIButton) {

        let main = UIStoryboard(name: "Main", bundle: nil)

        let previousViewControllerToGoTo = main.instantiateViewController(withIdentifier: "BlueBookUniversalBeamsVC")

        if delegate != nil {

            delegate?.dataToBePassedUsingProtocol(passedSelectedTableSectionNumberFromPreviousVc: self.selectedTableSectionNumberFromPreviousViewController, passedSelectedTableRowNumberFromPreviousVc: self.selectedTableRowNumberFromPreviousViewController)

        }

        self.present(previousViewControllerToGoTo, animated: true, completion: nil)

    }

}

Странно то, что в консоли Xcode, когда я go возвращается из VC2 в VC1, внутри расширения функции протокола в VC1 Я вижу, что значения печатаются правильно. Однако, когда значения печатаются изнутри viewDidLoad(), они оба отображаются как 0. Любая идея, почему это происходит, есть что-то, чего я здесь не хватает?

1 Ответ

0 голосов
/ 25 марта 2020

Ваш второй контроллер представления создает новый экземпляр первого контроллера представления, а не использует экземпляр, который уже был там. Контроллер второго вида не должен present снова первый контроллер вида, а должен dismiss (или pop) вернуться к нему, в зависимости от первого представленного или выдвинутого к нему.

Кстати свойство delegate второго контроллера представления, которое указывает на первый, должно быть свойством weak. Вы никогда не хотите, чтобы дочерний объект поддерживал строгую ссылку на родительский объект. Кроме того, делегаты почти всегда слабы ...

...