Деинициализация ViewController после увольнения? - PullRequest
0 голосов
/ 25 марта 2020

У меня в приложении два viewController, код для первого viewController такой, как показано ниже:

           import UIKit

            class firstViewController: UIViewController {

              // The below two variables will be passed from the firstViewController to the secondViewController then back again from the secondViewController to the firstViewController:

              var selectedRowValue: Int = 0

              var selectedSectionValue: Int = 0

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

               lazy var secondViewController = main.instantiateViewController(withIdentifier: "secondViewController")

             override func viewDidLoad() {

             super.viewDidLoad()

              }

    // The below function will be triggered when the user tap on a specific tableView cell detailClosure icon. This is when the needed data get sent from this viewController to the secondViewController:

            func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {

             let secondViewControllerProperties = secondViewController as! secondViewController

              secondViewControllerProperties.receivedSelectedSectionValueFromFirstVc = indexPath.section

              secondViewControllerProperties.receivedSelectedRowValueFromFirstVc = indexPath.row

    // The below is the relevant content of a UILabel inside the tapped tableView cell by the user that get send to the secondViewController for it to be displayed as its NavigationBar title:

             secondViewControllerProperties.selectedUniversalBeamSectionDesignation = arrayWithAllDataRelatedToUbsSections.filter({ $0.sectionSerialNumber == "\(arrayWithAllSectionsSerialNumbers[indexPath.section])" }).map({ $0.fullSectionDesignation })[indexPath.row]

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

             }

            }

    // The below extension inside the firstViewController is used to pass data back from the secondViewController to the firstViewController:

        extension firstViewController: ProtocolToPassDataBackwardsFromSecondVcToFirstVc {

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

                self.selectedRowValue = passedSelectedTableRowNumberFromPreviousVc

                self. selectedSectionValue = passedSelectedTableSectionNumberFromPreviousVc

        }

        }

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

import UIKit

class secondViewController: UIViewController {

    weak var delegate: ProtocolToPassDataBackwardsFromSecondVcToFirstVc?

// The below variables get their values when the data get passed from the firstViewController to the secondViewController:

    var receivedSelectedRowValueFromFirstVc: Int = 0

    var receivedSelectedSectionValueFromFirstVc: Int = 0

   var selectedUniversalBeamSectionDesignation: String = ""

// Inside the below navigationBar declaration, its labelTitleText will depend on the tapped tableViewCell by the user inside the firstViewController:

lazy var navigationBar = CustomUINavigationBar(navBarLeftButtonTarget: self, navBarLeftButtonSelector: #selector(navigationBarLeftButtonPressed(sender:)), labelTitleText: "UB \(selectedUniversalBeamSectionDesignation)", navBarDelegate: self)

    override func viewDidLoad() {

        super.viewDidLoad()

        view.addSubview(navigationBar)

}

// The below gets triggered when the user hit the back button inside the navigationBar of the secondViewController. This is where using the Protocol data get passed back to the firstViewController: 

extension secondViewController: UINavigationBarDelegate {

    @objc func navigationBarLeftButtonPressed(sender : UIButton) {

        if delegate != nil {

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

        }

        dismiss(animated: true) {}

    }

}

Однако, что я замечаю, так это всякий раз, когда secondViewController закрывается, когда пользователь нажимает кнопку «Назад» внутри навигационной панели secondViewController. SecondViewController не деинициализируется, и поэтому всякий раз, когда я нажимаю на другую ячейку внутри tableView внутри firstViewController, заголовок navigationBar, который отображается внутри secondViewController, остается таким же, как и тот, который отображался при первом нажатии. Поскольку secondViewController не был деинициализирован и, таким образом, я вижу те же значения, что и при первой инициализации.

Мой вопрос состоит в том, как деинициализировать secondViewController при его удалении, чтобы каждый когда я нажимаю на другую ячейку внутри tableView внутри firstViewController, инициализируется новый secondViewController?

1 Ответ

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

Ваш код генерирует secondViewController один раз и использует его повторно (это свойство).

               lazy var secondViewController = main.instantiateViewController(withIdentifier: "secondViewController")

Это означает, что он будет действовать до тех пор, пока не будет разрушен первый контроллер вида, и, конечно, - будет использован повторно.
Вместо этого вы должны создать его по мере необходимости.

func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
             // Create the second view controller
             let secondViewController = main.instantiateViewController(withIdentifier: "secondViewController")

             let secondViewControllerProperties = secondViewController as! secondViewController

              secondViewControllerProperties.receivedSelectedSectionValueFromFirstVc = indexPath.section

              secondViewControllerProperties.receivedSelectedRowValueFromFirstVc = indexPath.row

    // The below is the relevant content of a UILabel inside the tapped tableView cell by the user that get send to the secondViewController for it to be displayed as its NavigationBar title:

             secondViewControllerProperties.selectedUniversalBeamSectionDesignation = arrayWithAllDataRelatedToUbsSections.filter({ $0.sectionSerialNumber == "\(arrayWithAllSectionsSerialNumbers[indexPath.section])" }).map({ $0.fullSectionDesignation })[indexPath.row]

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

             }

            }

Удалите, конечно, lazy var, он больше не нужен.
Кроме того, вы можете просто сделать:
let secondViewController = main.instantiateViewController(withIdentifier: "secondViewController") as! SecondViewController вместо того, чтобы использовать его позже, это немного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...