【问题标题】:Navigate programmatically inside a custom UITabBarController (Swift)在自定义 UITabBarController (Swift) 中以编程方式导航
【发布时间】:2021-07-08 17:48:22
【问题描述】:

我正在使用基于Pavel Bogart solution 的自定义UITabBarController:非常简单、有用且非常适合我需要做的事情。 除非有一件我不知道如何管理的事情:如何以编程方式从 1 个 VC 切换到另一个(因此,没有触摸 tabBar 项)。

我用selectedIndex = X、modalPresentationStyle = .fullScreen 尝试了一些函数,但没有什么真正具体的东西可以像我们在 UITabBarController 上触摸项目一样完成。

代码如下:

class MainTabBarController: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()
    setupTabBar()

}

var TabControllers = [VC1(), VC2(), VC3(), VC4(), VC5()]

func setupTabBar(){
    tabBar.backgroundColor = Theme.navBarBackgroundColor
    tabBar.isTranslucent = true
    tabBar.clipsToBounds = true
    
    let screen1 = createNavController(vc: TabControllers[0], selected: #imageLiteral(resourceName: "img1on"), unselected: #imageLiteral(resourceName: "img1off"), label: "Name1")
    let screen2 = createNavController(vc: TabControllers[1], selected: #imageLiteral(resourceName: "img2on"), unselected: #imageLiteral(resourceName: "img2off"),  label: "Name2")
    let screen3 = createNavController(vc: TabControllers[2], selected: #imageLiteral(resourceName: "img3on"), unselected: #imageLiteral(resourceName: "img3off"),  label: "Name3")
    let screen4 = createNavController(vc: TabControllers[3], selected: #imageLiteral(resourceName: "img4on"), unselected: #imageLiteral(resourceName: "img4off"),  label: "Name4")
    let screen5 = createNavController(vc: TabControllers[4], selected: #imageLiteral(resourceName: "img5on"), unselected: #imageLiteral(resourceName: "img5off"),  label: "Name5")
    
    viewControllers = [screen1, screen2, screen3, screen4, screen5]
    
    guard let items = tabBar.items else { return }
    for item in items {
        let unselectedItem = [NSAttributedString.Key.foregroundColor: Theme.darkTextColor]
        let selectedItem = [NSAttributedString.Key.foregroundColor: Theme.mainAccentColor]
        let attributes = [NSAttributedString.Key.font: UIFont(name: Theme.subTitle, size: 16)]
        item.setTitleTextAttributes(attributes as [NSAttributedString.Key : Any], for: .normal)
        item.setTitleTextAttributes(attributes as [NSAttributedString.Key : Any], for: .selected)
        item.setTitleTextAttributes(unselectedItem as [NSAttributedString.Key : Any], for: .normal)
        item.setTitleTextAttributes(selectedItem as [NSAttributedString.Key : Any], for: .selected)
    }
}

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

}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    AppUtility.lockOrientation(.all)
}

}

及其扩展:

extension UITabBarController {

func createNavController(vc: UIViewController, selected: UIImage, unselected: UIImage, label: String) -> UINavigationController {
    let viewController = vc
    let navController = UINavigationController(rootViewController: viewController)
    navController.tabBarItem.image = unselected
    navController.tabBarItem.selectedImage = selected
    navController.tabBarItem.title = label
    return navController
}

}

告诉我你的想法。

【问题讨论】:

    标签: swift uinavigationcontroller uitabbarcontroller


    【解决方案1】:

    selectedIndex 对你不起作用,这太奇怪了,我做了一个类似的解决方案,对我有用。

    尝试正确引用您的根控制器(在本例中为您的 UITabBarController)和子控制器,并通过 strong 引用保持它们的活动状态。

    我做了一个简单的项目来演示它。

    Programmatic TabBarController repo

    希望能帮到你!

    【讨论】:

    • 刚刚快速检查了您的 Git 存储库,看起来不错!稍后我会详细了解并让您知道它是否可以,但结果正是我需要的:我没有理由不适应它。我认为解决方案是使用惰性 var 保持强引用,但我也认为使用简单的 selectedIndex 会更容易,而且绝对不是……没关系……非常感谢!
    • 不错! lazy 参考只是为了方便创建。可能是let 或var,但引用必须存在。 PS。希望得到我的第一个“正确答案”以改善我的个人资料,如果它对您有用,我愿意提供进一步的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多