Подтвердить что ты не робот

Атрибут заголовка UIViewController в раскадровке

Я устанавливаю поле заголовка UIViewController через Interface Builder/Storyboard: enter image description here

Этот контроллер представления вложен в UINavigationController, который, в свою очередь, вложен в UITabBarController. Когда я запускаю приложение, у меня нет элемента заголовка, и элемент панели табуляции не имеет.

Если я явно установил заголовок элемента навигации диспетчера представлений, а также заголовок элемента панели табуляции в построителе интерфейса, то он работает просто отлично.

Мне интересно:

a) Если я не использую Storyboard, а просто обычные xibs, установка заголовка контроллера представления неявно устанавливает заголовок элементов навигации, а также заголовок элемента панели табуляции. Но это не одна и та же раскадровка. Это предполагаемое поведение?

b) В чем же цель заголовка контроллера просмотра (в раскадровке)? это, кажется, не имеет эффекта.

Спасибо!

4b9b3361

Ответ 1

Вы можете установить заголовок UINavigationBar в Storyboard, дважды щелкнув фактическую панель навигации и напечатав там заголовок. Это устанавливает только заголовок для UINavigationBar.

Настройка заголовка в коде предлагает несколько разных возможностей.

self.title = @"Your title"; установит заголовок навигационной панели, а также приведет к каскадному типу заголовка к UITabBarItem, если он есть.

self.navigationItem.title = @"Your title"; будет указывать только заголовок навигационной панели, предполагая наличие UINavigationController и НЕ воздействовать на UITabBarItem.

self.navigationController.title = @"Your title"; установит заголовок UITabBarItem, но не UINavigationBar.

Ответ 2

Шаг 1

Если вы ищете Xib в Xcode Interface Builder, загляните в панель "Структура документа" (вторая панель слева). Разверните контроллер вида, с которым вы работаете, пока не найдете значок с надписью "Пункт навигации".

Document Outline panel showing Navigation Item

Шаг 2

Если затем выделить пункт "Навигация" и открыть панель "Утилиты" (наиболее удаленную справа) и щелкнуть "Инспектор атрибутов", вы увидите, где вы можете установить заголовок контроллера вида. Это способ сделать это в Interface Builder, а не делать это через код.

Utilities panel showing how to set title of view controller

Ответ 3

Я столкнулся с этим вопросом сегодня утром. Вот те удары, которые я взял, и окончательное решение.

Это правильно записывает заголовок контроллера детского представления, как установлено в раскадровке, но не влияет на то, что представлено:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"Title: %@", self.title);
}

Это не действует; заголовок все еще не отображается (возможно, делает "if (! [_ title isEqualToString: title]) {}" Пользователь капота:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = [self.title copy];
}

Это приведет к правильной установке заголовка:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *title = self.title;
    self.title = nil;
    self.title = title;
}

Я предполагаю, что UINavigationController вытаскивает заголовок для представления, представленного до его загрузки из раскадровки, но затем не начинает прослушивать изменения до тех пор, пока не будет установлено свойство. Однако я не использую раскадровки или наконечники очень часто, поэтому вполне возможно наличие волшебного флажка для этого скрытого где-то, что я пропустил.

В любом случае, похоже, что вы можете либо сделать self.navigationItem.title= self.title dance, либо выше, в качестве обходного пути и сохранить свои титулы в IB.

Яблочные документы для этого кажутся ясными:

Контроллер навигации обновляет середину панели навигации как следующим образом:

  • Если новый контроллер верхнего уровня имеет собственное представление заголовка, панель навигации отображает это представление вместо заголовка заголовка по умолчанию. Чтобы указать собственное представление заголовка, задайте свойство titleView вида элементов навигации контроллеров.

  • Если пользовательский заголовок не задан, на панели навигации отображается метка, содержащая заголовок по умолчанию для диспетчера представлений. Строка для этого метка обычно, полученная из свойства заголовка вида сам контроллер. Если вы хотите отобразить другой заголовок, один, связанный с контроллером представления, устанавливает свойство title для вместо этого выберите элемент навигации диспетчера элементов управления.

Акцент на мой.

Ответ 4

Я столкнулся с одной и той же проблемой. Я не понимаю, почему он не работает... Это может быть специально или просто быть ошибкой.

Чтобы изменить заголовок в построителе интерфейсов, вы можете напрямую щелкнуть элемент навигации и изменить название там:

enter image description here

Ответ 5

Все остальное на этой странице не удалось. На данный момент это работает, в коде, в viewDidLoad:

NSString* text = @"My page title";
UIFont* font = [UIFont systemFontOfSize:20.0];
const CGSize SIZE = [text sizeWithAttributes:@{NSFontAttributeName:font}];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, SIZE.width, SIZE.height)];
label.text = text;
label.textColor = UIColor.blackColor;
self.navigationItem.titleView = label;

Ответ 6

Я думаю, что это работает так, как будто мы ожидаем другого поведения. Если вы напечатаете свойство title в - (void) viewDidLoad, это будет то же самое значение, которое вы установили в панели рассказов, поэтому я не вижу причин, по которым это не работает, если не выбор Apple.

Ответ 7

a) Если я не использую Storyboard, а просто обычные xibs, установка заголовка контроллера представления неявно устанавливает заголовок элементов навигации, а также заголовок элемента панели табуляции. Но это не одна и та же раскадровка. Это предполагаемое поведение?

Я считаю, что это намеченное поведение. Я думаю, что цель атрибута title контроллера вида - это скорее свойство, которое может быть использовано на усмотрение разработчика, возможно, для различения контроллеров.

Другим поводом для этого изменения я считаю, что название элемента навигации может отличаться от заголовка панели вкладок, поскольку заголовок панели табуляции не может быть почти до тех пор, пока заголовок навигации.

b) В чем же цель заголовка контроллера просмотра (в раскадровке)? это, кажется, не имеет эффекта.

Думаю, я упомянул об этом в своем первом абзаце. Я считаю, что атрибут title контроллера - это свойство, которое разработчик может использовать, возможно, для различения контроллеров.

Ответ 8

Я пробовал все вышеперечисленные методы, даже пытался вручную добавить панель навигации, но безрезультатно.

Итак, это то, что сработало для меня.

Удалите элемент навигационной панели, который вы вручную добавили в контроллер просмотра, и добавьте его в свой метод viewDidLoad

self.navigationController.navigationBar.topItem.title = @"My Title";

или

self.navigationController.topViewController.title = @"My Title";

Ответ 9

В моем случае я решаю с этим:

    [self.tabBarController.navigationItem setTitle:@"My Title"];

Ответ 10

Если у вас есть UINavigationItem present, вы должны использовать заголовок пункта навигации в раскадровке. Если у вас нет элемента навигации для контроллера вида, тогда UINavigationController будет использовать свойство управления представлением title.

Пример: Вот два примера

В вашем раскадровке, если у вас есть элемент навигации, навигационный контроллер не должен читать заголовок контроллера просмотра. Даже если поле заголовка пуст для этого элемента навигации.

Удалите элемент навигации (если вы можете, вы не сможете сделать это для контроллера корневого представления, но вы будете для других), и ваш заголовок будет правильно загружен