【问题标题】:Change NavigationBar Title (font and color) in different View Controllers在不同的视图控制器中更改 NavigationBar 标题(字体和颜色)
【发布时间】:2011-11-17 11:48:30
【问题描述】:

我试图在我的应用中自定义导航栏标题的外观。

我必须构建一个自定义导航控制器(不仅仅是为了这个问题),所以我想像这样覆盖 setTitle 函数

- (void)setTitle:(NSString *)title
{
    NSLog(@"SETTING TITLE %@", title);
   [super setTitle:title];
   UILabel *titleView = (UILabel *)self.navigationBar.topItem.titleView;
   NSLog(@"title view is %@", titleView);
    if (!titleView) {
        titleView = [[UILabel alloc] initWithFrame:CGRectZero];
        titleView.backgroundColor = [UIColor clearColor];
        titleView.font = [UIFont fontWithName:@"TradeGothicLTStd-Bold-Accent-Accent" size:20];
        titleView.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
        titleView.textColor = [UIColor whiteColor];
        self.navigationBar.topItem.titleView = titleView;
        [titleView release];
    }
    titleView.text = [title uppercaseString];
    [titleView sizeToFit];

    self.navigationBar.tintColor= [UIColor colorWithRed:130.0f/255.0f green:120.0f/255.0f blue:90.0f/255.0f alpha:1.0f];
}

一切都按预期进行。 现在的问题是在导航控制器内部我有一个 TableView。当单击一个单元格时,应用程序会向下钻取到另一个 TableView,它应该再次具有自定义标题。

这是 didSelectRowAtIndexPath 的代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSString *category_id = [[managedObject valueForKey:@"category_id"] stringValue];
    NSString *name = [[[managedObject valueForKey:@"name"] description] capitalizedString];
    CategoryViewController *category = [[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil];
    category.category_id = category_id;
    category.name = name;
    category.managedObjectContext = self.managedObjectContext;
    // ...
    // Pass the selected object to the new view controller.
    [self.navigationController pushViewController:category animated:YES];
    [category release];
}

....但是当所选视图出现时,它会以标准字体显示。

编辑 我注意到如果在第二个视图中我在 viewDidAppear 方法中设置标题,它会发生一些不同的事情。 如果我写

- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.title = name;
[super viewDidAppear:animated];
}

...导航栏中的标题具有正确的(自定义)字体,但标题就像只有在视图完成滑入时才会出现......? 同样,我显然在这里做错了,任何帮助将不胜感激:)

感谢您的宝贵时间!

【问题讨论】:

    标签: iphone uitableview navigationcontroller navigationbar


    【解决方案1】:

    代码sn-p

    [[UINavigationBar appearance] setTintColor:[UIColor colorWithRed:107.0/256.0 green:145.0/256.0 blue:35.0/256.0 alpha:1.0]]; 
    

    会改变整个应用导航栏的颜色。

    只需将其放在 Appdelegate 的 didFinishLauncing 方法中即可。

    【讨论】:

      【解决方案2】:

      从 iOS 5 开始,您可以直接使用 UINavigationBar 完成此操作

      https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UINavigationBar_Class/Reference/UINavigationBar.html 自定义导航栏的外观

      只需设置titleTextAttributes 字典

      【讨论】:

      • 感谢您的回复,但应用必须兼容 4.0 :(
      • 再次感谢,我看到了这篇文章,你会发现我实际上评论了一个答案,我在这里写的部分代码取自那里:) 真正让我困惑的是 Erik B. 告诉我“你应该把它放在所有需要更改标题颜色的视图控制器中。”但是为什么我的导航自定义类中的代码没有正确触发呢?我是一个 Objective-C 菜鸟 :(
      【解决方案3】:

      对于 iOS7 及更高版本,解决方案如下:

      [UINavigationBar appearance].barTintColor = [UIColor redColor];
      

      将此代码粘贴到 AppDelegate (didFinishLaunching:) 方法中,一切正常。

      【讨论】:

        【解决方案4】:

        不要在viewDidAppear 方法中设置,而是在viewDidLoad 方法中设置。

        【讨论】:

        • 感谢您的回复,但如果我在第二个视图的 viewDidLoad 方法中设置“self.navigationController.title = name”,则单击该行时,第一个视图中的标题会在第二个视图之前更改滑入
        猜你喜欢
        • 2017-12-09
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        相关资源
        最近更新 更多