Как обновить значение в V C, когда вкладка выбрана из UITabbarController? - PullRequest
1 голос
/ 05 мая 2020

У меня есть контроллер панели вкладок. Когда пользователь нажимает одну из кнопок панели вкладок, мне нужно обновить значение в UIPageViewController, которое находится в целевом контроллере представления.

Я пытаюсь использовать делегата, чтобы сообщить UIPageViewController, какая кнопка панели вкладок был нажат:

protocol PlanTypeDelegate {
    func setIntro(thisFlow planType: UITabBarItem)
}

class NewTabBarController: UITabBarController {

var planTypeDelegate : PlanTypeDelegate?

override func viewDidLoad() {
        super.viewDidLoad()

        // create and handle tab bar button actions
}


override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        planTypeDelegate?.setIntro(thisFlow: item)
    }

В моем UIPageController у меня есть следующее:

class IntroPageController: UIPageViewController {

override func viewDidLoad() {
        super.viewDidLoad()

guard let tabbar = self.parent as? NewTabBarController() else { return }
    tabbar.delegate = self

}

}

extension IntroPageController : PlanTypeDelegate {
    func setIntro(thisFlow planType: UITabBarItem) {
        print("this item:\(planType)")
    }
}

Вместо этого я получаю это сообщение об ошибке: enter image description here

Я новичок в передаче данных между VC, поэтому я не знаю, как go обрабатывать этот сценарий.

EDIT Та же ошибка после обновления enter image description here

1 Ответ

1 голос
/ 05 мая 2020

Вы можете достичь этого так ... без делегата ... напишите метод setIntro в IntroPageController я надеюсь, что он решит вашу проблему

class NewTabBarController: UITabBarController {
override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self

    }
}
 func tabBarController(_ tabBarController: UITabBarController,
                          shouldSelect viewController: UIViewController) -> Bool{

        if let controller = viewController as? IntroPageController {

            controller.setIntro(thisFlow: tabBarController.tabBarItem)
        }
        return true
    }

Вы также можете достичь этого с помощью протокола для этого пишите ... Все контроллеры, которые подтверждают PlanTypeDelegate, могут выполнять действия против этого метода

 func tabBarController(_ tabBarController: UITabBarController,
                          shouldSelect viewController: UIViewController) -> Bool{

        if let navController = viewController as? UINavigationController {
            if let myViewController  = navController.topViewController , let homeController = myViewController as? PlanTypeDelegate {
                homeController.setIntro(thisFlow: tabBarController.tabBarItem)
            }
        } else if let controller = viewController as? PlanTypeDelegate {

            controller.setIntro(thisFlow: tabBarController.tabBarItem)
        }
        return true
    }
...