如何在UITabbarController中选择一个标签时更新VC中的值?

问题描述 投票:0回答:1

我有一个tabbar控制器,当用户点击一个tabbar按钮时,我需要更新UIPageViewController中的一个值。当用户点击其中一个标签栏按钮时,我需要更新目标视图控制器中的UIPageViewController中的一个值。

我试图使用一个委托来通知一个UIPageViewController,哪个tab栏按钮被点击了。

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之间传递数据的新手,所以我不知道如何处理这种情况。

EDIT更新后同样的错误enter image description here

swift delegates protocols
1个回答
1
投票

你可以实现这样的......没有Delegate......编写 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
    }
© www.soinside.com 2019 - 2024. All rights reserved.