【问题标题】:Change tab name in uitabbarcontroller在 uitabbarcontroller 中更改选项卡名称
【发布时间】:2011-11-07 04:51:54
【问题描述】:

我有一个 TabBarController 设置为主控制器选项卡,其中名称是使用界面生成器定义的。现在我想以编程方式更改其名称。

怎么可能?

【问题讨论】:

    标签: ios objective-c iphone cocoa-touch uitabbarcontroller


    【解决方案1】:

    Swift 4+

    tabBarController?.tabBar.items![1].title = "xx"
    

    【讨论】:

      【解决方案2】:

      我使用的是 Xcode 版本 8.2.1 (8C1002),这对我有用:

      【讨论】:

        【解决方案3】:

        更新到 XCode 8

        自从我最初回答以来,发生了很多事情:Swift 3、Storyboards 等。标题通常是所有视图共享的,可以在属性检查器中设置

        此外,为了获得更多控制,您始终可以从设计器视图中拖动 UITabBarItemUINavigationItem 元素。您必须将它们拖到将在选项卡栏/导航控制器中显示的视图。基本上他们将信息存储为“我想像这样显示在标签栏中”。

        Hello Scene 正在添加一个 TabBarItem,因此可以对其进行配置。

        这两个元素的行为与通过代码访问视图控制器的.tabBarItem.navigationItem 属性完全相同。如果这些属性是相应对象的子对象(nav 具有 navItem,tab 具有 tabItem),则它们始终存在于代码中,您无需将它们添加到 storyboard/xib 中即可拥有它们。

        最后这件事有点令人困惑,因为在故事板/xib 中,您似乎正在将它们添加到视图控制器,但实际上您只是在说“笔尖也会配置这些属性”。

        原答案

        标签栏上出现的名字来自UIViewControllertitle属性,

        self.title = @"Name me!";
        

        您可以随时更改标题,它应该会更新出现在标签栏项目上的文本。但要小心,尽快执行此操作,最好在使用中的init 方法(或initWithNibName:bundle:,或initWithCoder:)中。

        这里的关键是,一旦标签栏出现在屏幕上,就会调用 init 方法,因为它会初始化其所有视图控制器。如果您要在 viewDidLoad 上执行此操作,则只有在您实际选择选项卡时才会调用它,然后是其他调用系列,awakeFromNibviewWillAppear:viewDidAppear: 等也是如此。

        UIViewController 上有一个标题的想法是保持一致。如果你在 UINavigationController 上显示 viewController,顶部的导航栏应该使用 title 属性,就像使用 back 时一样。 UITabBarController 也尊重相同的 title 属性并相应更改。

        就可重用性而言,您应该只从UIViewController 子类的内部设置标题。

        笔尖之道

        使用笔尖或情节提要?如果你有UIViewController,你可以在属性检查器中直接给它起名字(或4

        不幸的是,如果文件所有者是UIViewController 子类,那么您将无法通过这种方式访问​​它,原因很简单,XCode 将文件所有者注册为“外部对象”,并且没有显示它的配置面板。 :(

        多个标题,同一个视图控制器

        但有时,您只是想让它们命名不同

        // Modify the display title on the tab bar
        self.tabBarItem.title = @"World";
        
        // Modify the display title on the navigation bar
        self.navigationItem.title = @"Hello World";
        

        与邻居搞砸

        每个 UIViewController 都应该处理自己的名字,如果你想从外部强制它怎么办(因此,完全违反了我原来所说的可重用性)?

        // Rename the other guy's .title property
        [[self.tabBarController.viewControllers objectAtIndex:<#Index#>] setTitle:@"Hello World"];
        
        // Or do as before, and rename the other guy's tab bar 
        [(UITabBarItem*)[self.tabBarController.tabBar.items objectAtIndex:<#index#>] setTitle:@"Hello World"];
        

        你也可以用导航项来做,但这需要比我更舒服的体操。

        【讨论】:

        • 我已经尝试过了,它不会产生任何错误。但是它不起作用,选项卡名称保持不变。
        • self.tabBarItem.title 解决方案对我也不起作用,但另一种解决方案适用:[[self.parentViewController.tabBarController.tabBar.items objectAtIndex:4] setTitle:@"NewTitle"];
        • 多个标题,相同的视图控制器部分帮助了我很多。谢谢你我的朋友
        • FWIW,我不得不修改 parentViewController 的 tabBarItem 而不是视图控制器本身
        【解决方案4】:

        但是可以在代码中完成,最好直接在 Storyboard 中进行设置。怎么样?

        只需点击相应的标签栏项目在控制器内不在标签栏控制器内)。

        然后在实用工具面板上切换到attribute inspector

        现在你可以改变一切了:-)

        【讨论】:

        • 这其实就是答案(=
        【解决方案5】:

        在您的 viewController.m

        - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
        {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
          //Here you are setting title
        
        self.title = NSLocalizedString(@"Title", @"Title");
        
        }
        return self;
        }
        

        【讨论】:

          【解决方案6】:

          您可能希望在 UITabBarController::viewDidLoad 中执行此操作,在这种情况下,您需要设置视图控制器的标题,因为此时标签栏项目当前为 0。 所以使用

          [[self.viewControllers objectAtIndex:0] setTitle: @"Buga"];
          [[self.viewControllers objectAtIndex:1] setTitle: @"Nuga"];
          

          【讨论】:

          • 我不明白为什么你的回答不接受......这真是太棒了!谢谢!你节省了我的时间!
          【解决方案7】:

          这是更改标签栏图标名称和图像的方法:

           self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Main Tab" image:[UIImage imageNamed:@"maintab.png"]] autorelease];
          

          【讨论】:

          • 小心,你不会发布新的 UITabBarItem,要么附加一个[ autorelease],要么创建一个新的,添加它,然后释放它。
          • 谢谢,我改了。我正在使用 ARC,所以没有。
          • 无需创建新的。无论是否存在内存泄漏,这都是一个糟糕的解决方案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多