Когда я должен создать свой UINavigationBar?

У меня есть ViewController, у которого есть метод для разработки UINavigationBar, SubViewController, который наследуется от ViewController и вызывает его метод проектирования, а также LookingViewController и SecondViewController, которые наследуются от SubViewController.

ShowingViewController является корневым контроллером UINavigationController и выполняет переход "Показать" к SecondViewController. У них обоих есть свойство NSString "presentProperty". ViewController устанавливает пользовательский titelView для панели навигации, которая показывает строку свойств.

Мой вопрос: где я должен вызвать метод проектирования ViewController?

Когда я вызываю его в viewWillLoad, я не буду работать, когда я переключаюсь на SecondViewController, потому что метод изменяет панель навигации "старого" ShowingViewController.

Когда я вызываю его в viewDidLoad, пользователь увидит ранее не спроектированную панель навигации.

Код моего метода проектирования:

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 ответа

Вы можете попробовать это.

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

Вы должны настроить titleView для панели навигации в:

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

    <your titleView code here>
}

Это вызывается после viewDidLoad в первый раз и вызывается позже, когда другие ViewController выше текущего выталкиваются из стека навигации. Хорошую диаграмму состояний жизненных циклов ViewController можно найти в документации по адресу https://developer.apple.com/documentation/uikit/uiviewcontroller

В отношении стиля вы также можете установить titleView с помощью этого кода:

self.navigationItem.titleView = <your-view>;
Другие вопросы по тегам