У меня есть TabBarController, установленный как вкладка главного контроллера, где имена были определены с помощью конструктора интерфейса. Теперь я хочу изменить свои имена программно.
Как это можно сделать?
У меня есть TabBarController, установленный как вкладка главного контроллера, где имена были определены с помощью конструктора интерфейса. Теперь я хочу изменить свои имена программно.
Как это можно сделать?
С моего первоначального ответа произошло много: Swift 3, Storyboards и т.д. Название обычно совпадает с общим представлением всех просмотров и может быть установлено в инспекторе атрибутов
Кроме того, для большего контроля вы всегда можете перетащить элементы UITabBarItem
и UINavigationItem
из представления конструктора. Вы должны перетащить их в представление, которое будет отображаться в панели вкладок/навигационном контроллере. В основном они хранят информацию как "Я хочу быть отображенным в панели вкладок, как это".
Hello Scene получает добавленный TabBarItem, поэтому его можно настроить.
Эти два элемента ведут себя точно так же, как доступ к свойствам контроллера просмотра .tabBarItem
и .navigationItem
через код. Эти свойства всегда существуют в коде, если они являются дочерними элементами соответствующего объекта (nav имеет navItem, а tab имеет tabItem), вам не нужно добавлять их в раскадровку /xib, чтобы иметь их.
Эта последняя вещь немного запутанна, так как в раскадровке /xib вы добавляете их в контроллер представления, но на самом деле вы просто говорите: "ниб будет также настраивать эти свойства".
Имя, которое появляется на панели вкладок, исходит из свойства UIViewController
title
,
self.title = @"Name me!";
Вы можете изменить заголовок в любой момент, и он должен обновить текст, появляющийся на элементе панели вкладок. Но будьте осторожны, сделайте это как можно скорее, в идеале, в используемом методе init
(или initWithNibName:bundle:
или initWithCoder:
).
Ключевым моментом здесь является то, что методы init вызываются, как только на панели вкладок появляется экран, так как он инициализирует весь свой контроллер. Если бы вы сделали это на viewDidLoad
, это вызвало бы вызов, только если вы на самом деле выбираете вкладку, а затем другое семейство вызовов, то же самое относится к awakeFromNib
, viewWillAppear:
, viewDidAppear:
и т.д.
Идея иметь заголовок на UIViewController
заключается в том, чтобы сохранить согласованность. Если вы покажете, что viewController на UINavigationController
, верхняя панель навигации должна использовать свойство title, как при обратном. UITabBarController
также учитывает одно и то же свойство title и соответственно изменяется.
В терминах повторного использования вы должны указывать заголовок только изнутри подкласса UIViewController
.
Использование nibs или раскадровки? Если у вас есть UIViewController
, вы можете дать ему имя прямо в инспекторе атрибутов (или ⌥ ⌘ 4)
К сожалению, если File Owner является подклассом UIViewController
, то вы не сможете получить к нему доступ таким образом, просто потому, что XCode регистрирует File Owner как "внешний объект" и не показывает для нее.: (
Но иногда вы просто хотите, чтобы они назывались по-разному
// 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 .title property
[[self.tabBarController.viewControllers objectAtIndex:<#Index#>] setTitle:@"Hello World"];
// Or do as before, and rename the other guy tab bar
[(UITabBarItem*)[self.tabBarController.tabBar.items objectAtIndex:<#index#>] setTitle:@"Hello World"];
Возможно, вы также можете сделать это с помощью элемента навигации, но для этого потребуется больше гимнастики, чем мне комфортно.
Однако это можно сделать в коде, лучше установить его непосредственно в раскадровке. Как?
Просто коснитесь соответствующего элемента панели вкладок внутри контроллера (НЕ ВНУТРЕННИЙ КОНТРОЛЛЕР TABBAR).
Затем переключитесь на attribute inspector
на панели Утилиты.
Теперь вы можете изменить все: -)
В 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;
}
Таким образом вы можете изменить имя и изображение значка панели вкладок:
self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Main Tab" image:[UIImage imageNamed:@"maintab.png"]] autorelease];
Вероятно, вы захотите сделать это в UITabBarController:: viewDidLoad, и в этом случае вам нужно установить заголовок контроллера представления, потому что в данный момент в пунктах панели вкладок находится 0. Поэтому используйте
[[self.viewControllers objectAtIndex:0] setTitle: @"Buga"];
[[self.viewControllers objectAtIndex:1] setTitle: @"Nuga"];
Я использую Xcode Version 8.2.1 (8C1002), и это работает для меня: