我什么时候应该设计我的UINavigationBar?

时间:2017-10-20 11:22:18

标签: ios objective-c uinavigationbar

我有一个ViewController,它有一个设计UINavigationBar的方法,一个继承自ViewController并调用其设计方法的SubViewController,以及一个继承自SubViewController的ShowingViewController和SecondViewController。

ShowingViewController是UINavigationController的根控制器,并对SecondViewController执行“Show”Segue。 它们都具有NSString属性“presentingProperty”。 ViewController将自定义titelView设置到显示属性字符串的导航栏。

我的问题:我应该在哪里调用ViewController的设计方法?

当我在viewWillLoad中调用它时,当我切换到SecondViewController时我将无法工作,因为该方法更改了“旧”ShowingViewController的NavigationBar。

当我在viewDidLoad中调用它时,用户将在之前看到未指定的NavigationBar。

我的设计方法代码:

if (self.navigationController.navigationBar) {
    UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 200, 21)];
    NSMutableAttributedString *titleText = [[NSMutableAttributedString alloc] initWithString:self.presentingProperty];
    [titleText addAttribute: NSForegroundColorAttributeName value: [UIColor whiteColor] range: NSMakeRange(0, self.presentingProperty.length)];
    [titleText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Avenir-Heavy" size:21] range:NSMakeRange(0, self.presentingProperty.length)];
    [titleLabel setTextAlignment:NSTextAlignmentCenter];
    [titleLabel setAttributedText: titleText];
    [self.navigationController.navigationBar.topItem setTitleView:titleLabel];
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你可以试试这个。

- (void)viewDidLoad
{
      self.navigationItem.titleView = <your titleView>
}
- (void)viewWillLayoutSubviews
{
     <your titleView>.frame = CGRectMake(....)
}

答案 1 :(得分:0)

您应该在以下位置为navigationBar设置titleView:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear: animated];

    <your titleView code here>
}

这是第一次在 viewDidLoad 之后调用,稍后当导航堆栈上弹出当前其他ViewControllers时调用。可以在sortedBy

的文档中找到ViewController生命周期的良好状态图

在样式上,您还可以使用以下代码设置titleView:

self.navigationItem.titleView = <your-view>;