【问题标题】:how to change uiviewcontroller title independent of tabbar item title如何更改独立于标签栏项目标题的uiviewcontroller标题
【发布时间】:2014-03-04 03:35:57
【问题描述】:

我在视图中设置了这样的视图控制器标题:

self.title = @"my title";

在此之前,我在情节提要中为其嵌入的视图控制器和导航控制器设置了标题。我将其设置为:“Title”;

当我单击包含视图控制器的选项卡时,选项卡栏项目的标题和uiviewcontroller 更改为:我的标题

我希望视图控制器更改,但标签栏项目保留标题:标题

我怎样才能做到这一点?

【问题讨论】:

    标签: ios cocoa-touch uiviewcontroller uitabbarcontroller


    【解决方案1】:

    听起来您希望更改导航栏中的标题,但不想更改标签栏中的标题。应该这样做。

    [self.navigationItem setTitle:@"my title"];
    

    斯威夫特:

    self.navigationItem.title = "My Title"
    

    【讨论】:

    • 如果你还在使用 self.title 设置你的 uitabbar 标题,请确保在设置 self.navigation setTitle 之后设置,否则它将不起作用
    • 在 xcode 9 和 ios 11 在 swift 4 中显示明确使用标题的错误
    • 使用 Swift 4.2 在 Xcode 10.2 中为我工作,非常感谢!
    【解决方案2】:

    所以对于那些仍然不明白的人(比如我)

    self.navigationItem.title = @"my title"; 设置导航栏标题。

    self.tabBarItem.title = @"my title"; 设置标签栏标题。

    self.title = @"my title"; 设置这两个

    【讨论】:

      【解决方案3】:

      斯威夫特

      设置顶部栏标题

      self.navigationController?.navigationBar.topItem?.title = "top title"
      

      设置标签项标题

      self.tabBarController?.tabBar.items?[0].title = "tab title"
      

      设置两个标题

      self.title = "both titles"
      

      【讨论】:

      • 什么是topItem
      • 这是我在配置中设置顶栏标题的唯一方法,不知道为什么“self.navigationItem.title”对我不起作用。
      【解决方案4】:

      对于 Swift 使用这个,

      self.navigationItem.title = "Navigation bar title" 
      self.title = "Tab bar title"
      

      【讨论】:

      • 在 xcode 9 和 ios 11 中的 swift 4 (self.navigation.title) 中显示明确使用标题的错误
      【解决方案5】:

      注意:如果您在每个视图控制器的根目录中都有一个带有导航控制器的标签栏控制器,那么在您设置navigationItem.title 时,在视图控制器上设置标签栏项目不会影响标题.您需要将 tabBarItem 设置到导航控制器上,而不是从标签栏控制器中获取它。

      其他人发布的答案都没有对我有用,因为我的标签栏的视图控制器都在其根部具有导航控制器 - 这是UITabBarController 的常见层次结构模式。您必须设置导航控制器的 tabBarItem 以使标题显示不同于 navigationItem 的标题

      您可以创建您的tabBarItem 并将它们直接关联到您的 VC,就像这样。

          let tabBarVCOne = BooksListViewController()
          tabBarVCOne.tabBarItem = UITabBarItem(title: "Books", image: nil, tag: 0)
      
          tabBarViewControllers.append(tabBarVCOne)
          ...
      

      然后你会有这样的东西:

          //Wrap each view controller in a navigation controller. 
          self.viewControllers = tabBarViewControllers.map(UINavigationController.init)
      

      但是为了从视图控制器中获取已经关联的tabBarItem 并自动将其设置到导航控制器上,应该将其更改为以下内容。

          self.viewControllers = tabBarViewControllers.map({
              let navigationController = UINavigationController(rootViewController: $0)
              navigationController.tabBarItem = $0.tabBarItem
              return navigationController
          })
      

      您现在可以拥有与为tabBarItem 定义的标题不同的标题(从您的 VC 设置)。

      【讨论】:

        【解决方案6】:

        斯威夫特 4.2

        给你,我为 UIViewController 创建了一个扩展:

        import UIKit
        
        extension UIViewController {
        
        /// Setting the navigation title and tab bar title
        ///
        /// - Parameters:
        ///   - navigationTitle: Navigation title
        ///   - tabBarTitle: TabBar title
        func setTitles(navigationTitle: String, tabBarTitle: String) {
            // Order is important here!
            title = tabBarTitle
            navigationItem.title = navigationTitle
         }
        
        }
        

        然后从你的控制器:

        override func viewDidLoad() {
            super.viewDidLoad()
            setTitles(navigationTitle: "Login", tabBarTitle: "Home")
        }
        

        【讨论】:

          【解决方案7】:

          这已经很晚了。您可以将 TabBarController 用作自身的 UITabBarControllerDelegate 和 UINavigationControllerDelegate 以及嵌入在每个选项卡中的导航控制器。

          .h:

          @interface YourTabBarController : UITabBarController <UITabBarControllerDelegate, UINavigationControllerDelegate>
          
          @end
          

          .m:

          - (void) viewDidLoad {
              // UITabBarControllerDelegate
              self.delegate = self;
          
              // UINavigationControllerDelegates
              yourNavigationController.delegate = self;
              ...
          }
          
          - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
              yourNavigationController.tabBarItem.title = @"Tab Bar Title";
              ...
          }
          
          - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
              yourNavigationController.tabBarItem.title = @"Tab Bar Title";
              ...
          }
          

          根据一些快速测试,这两个委托操作似乎应该涵盖任何松散的情况,并且无论您是在切换选项卡还是在导航控制器中浏览都会更新标题。为了完整起见,您也可以在didShowViewController 中更新您的标题,但根据我所看到的,我认为没有必要。

          【讨论】:

            【解决方案8】:

            可能有点晚了(但是)。

            设置 VC 的标题会更改 Navigation 和 tabBar 的标题。 (如果 VC 已经连接到两者)。

            如果你想有单独的标题,你需要手动设置这些,你通常为 VC 设置标题,然后特别是 tabBarItem 的标题,因为它是

            【讨论】:

              【解决方案9】:

              设置导航标题是正确的答案,但是当它对我不起作用时,因为我只使用了 tabbarcontroller 和与之相关的控制器。首先,我需要为视图控制器添加导航控制器,然后它才能完美运行。

                 override func viewDidLoad() {
                  super.viewDidLoad()
                  self.navigationItem.title = "Navigation bar title"
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-07-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多