无法在选项卡栏控制器下的视图控制器内自定义导航栏

Unable to customize my navigation bar inside the viewcontroller that is under a tabbar controller

提问人:nakim81 提问时间:11/2/2023 最后编辑:nakim81 更新时间:11/2/2023 访问量:27

问:

我的选项卡栏控制器下有三个视图控制器。 它们扩展了 BaseViewController 以进行导航自定义。 在选项卡栏控制器之外的其他视图控制器中,BaseViewController 可以正常工作。但是在tabbar控制器的视图控制器中,任何更改都会反映出来,并且只显示带有默认后退按钮的默认导航栏。

    func configureSettingBtn() {
        let settingImage = UIImage(named: "settingIcon")
        let settingBtn = UIButton()
        settingBtn.setImage(settingImage, for: .normal)
        settingBtn.addTarget(self, action: #selector(settingApp), for: .touchUpInside)
        let setting = UIBarButtonItem(customView: settingBtn)
        
        navigationItem.rightBarButtonItems = [setting]
    }
    
    @objc func settingApp(sender: UIBarButtonItem) {
        
    }
    
    func configureInfoBtn() {
        let infoImage = UIImage(named: "infoIcon")
        let infoBtn = UIButton()
        infoBtn.setImage(infoImage, for: .normal)
        infoBtn.addTarget(self, action: #selector(infoAction), for: .touchUpInside)
        let info = UIBarButtonItem(customView: infoBtn)
        let spacer = createSpacer()
        
        self.navigationItem.rightBarButtonItems?.append(contentsOf: [spacer, info])
    }
    
    @objc func infoAction() {
        
    }
    
    func configureAnnounceBtn() {
        let announceImage = UIImage(named: "messageIcon")
        let announceBtn = UIButton()
        announceBtn.setImage(announceImage, for: .normal)
        announceBtn.addTarget(self, action: #selector(announceAction), for: .touchUpInside)
        let announce = UIBarButtonItem(customView: announceBtn)
        let spacer = createSpacer()
        
        self.navigationItem.rightBarButtonItems?.append(contentsOf: [spacer, announce])
    }
    
    @objc func announceAction() {
        
    }

我在 BaseViewController 中编写了这些函数并尝试使用它们,但它在选项卡栏下的视图控制器中不起作用。我尝试了我编写的代码,也尝试了在故事板中自定义导航栏,但失败了。我更喜欢代码工作。

我该如何解决这个问题?任何想法将不胜感激。

在选项卡栏控制器内为每个视图控制器中的按钮添加不同功能的想法也将不胜感激。

iOS Swift UITabbarController UIAningBar UIBARBUTTONITEM

评论

0赞 HangarRash 11/3/2023
您的问题缺乏足够的上下文。显示至少在选项卡控制器中的视图控制器上进行设置的相关代码。演示如何从 BaseViewController 使用这些方法。添加一两张屏幕截图,显示您正在获得的内容以及您期望获得的内容。

答:

0赞 bborisov-pixely 11/2/2023 #1

您遇到的问题可能是由于许多原因之一造成的,因此让我们看看是否可以尝试像这样找到它:

  1. 确保您的子视图控制器实际上是从 继承自 的。: BaseViewController
  2. 确保这些函数在子控制器生命周期中的某个时间点实际被调用。例如,在子控制器期间。configureSettingsBtn()configureInfoBtn()viewDidLoad

尝试调试并逐行处理断点,以查看每行发生的情况,并查看是否可以确定所有问题所在。

我还可以建议另一种方法,您可以创建这样的类:CustomNavigationController

class CustomNavigationController: UINavigationController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if let viewController = viewController as? BaseViewController {
            viewController.configureSettingBtn()
            viewController.configureInfoBtn()
            viewController.configureAnnounceBtn()
        }
    }
}

此外,如果您希望每个子控制器在按下按钮时表现不同,请确保覆盖以下功能:

class ChildViewController: BaseViewController {
    override func configureSettingBtn() {
        super.configureSettingBtn()
        // Customize the button further if needed
        // Or set a different target action specific to this view controller
    }
    
    @objc override func settingApp(sender: UIBarButtonItem) {
        // Implement custom action for this view controller
    }
}