Перезагрузить текущий viewcontroller в панели вкладок - PullRequest
0 голосов
/ 15 апреля 2020

В настоящее время у меня есть контроллер вида, который при нажатии на вкладку с индексом 3 (вкладка «Карта») загружает контроллер вида, который содержит карту (карта А). ПРИМЕЧАНИЕ: он должен всегда загружать карту A при каждом нажатии вкладки карты. На главной вкладке имеется индекс с индексом 0, который при нажатии позволяет переключиться с карты A на карту B, а затем переместит вас на эту карту (этот переключатель выполняется вручную, поэтому для сохранения панели вкладок на экране используется selectedIndex панели вкладок, что означает, что viewWillAppear (), по-видимому, не вызывается). ПРИМЕЧАНИЕ. Для карты A и карты B используется один и тот же viewController, для определения того, какой из них загружать в viewWillAppear, используется bool. . Карта B, когда я снова нажимаю на вкладку «Карта» на панели вкладок, она автоматически загружает текущую карту, на которой я только что был (Карта B), но, как было сказано ранее, при нажатии на панели вкладок должна загружаться только карта A.

Это то, что я пытался, но после нажатия на вкладку карта все равно не будет отображаться:

class MainTabBarController: UITabBarController {

 func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        switch viewController {
case is MapViewController:
            let nc = NotificationCenter.default
            nc.post(name: Notification.Name("changeMapStatus"), object: nil)
}
}

class MapViewController: BaseViewController {

    var mapBSelected: Bool = false

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        mapBSelected ? setupMapB() : setupMapA()
}

    @objc func changeMapStatus() {
          guard let mainTabController = tabBarController as? MainTabBarController else { return }
              mainTabController.refreshMapTab()
        self.MapBSelected = false
    }

}

   func refreshMapTab() {
             let index = PrimaryFeatureTab.map.displayOrder// enum to determine tab order
              DispatchQueue.main.async {
                      self.viewControllers?.remove(at: index)
                      self.viewControllers?.insert(PrimaryFeatureTab.map.rootViewController, at: index)
                  }
        }
}

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

In MapViewController ...

class MapViewController: BaseViewController {

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.setupMapA()
    }

}

Теперь, когда вы оставите вкладку карты, она вернется к карте A.

Нет необходимости в каком-либо коде в пользовательском TabBarController.

0 голосов
/ 16 апреля 2020

Вы можете сделать следующее


Создать закрытие в вашем FirstViewController следующим образом:

enum MapType {
    case mapA
    case mapB
}

class MainViewController: UIViewController {

    var mapSelectionClosure: ((MapType) -> Void)?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func aTapped(_ sender: Any) {
        mapSelectionClosure?(.mapA)
    }

    @IBAction func bTapped(_ sender: Any) {
        mapSelectionClosure?(.mapB)
    }

}

Затем вы можете установить это закрытие в вашем MainTabBarController следующим образом

class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let mainViewController = viewControllers?.first(where: { $0 is MainViewController }) as? MainViewController else {
            return
        }
        mainViewController.mapSelectionClosure = { mapType in
            self.setMapType(mapType)
        }

    }

    func setMapType(_ type: MapType) {
        guard let mapViewController = viewControllers?.first(where: { $0 is MapViewController }) as? MapViewController else {
            return
        }
        mapViewController.selectedMapType = type
    }

}
...