#iphone #objective-c #ipad #uinavigationcontroller
#iPhone #objective-c #iPad #uinavigationcontroller
Вопрос:
У меня есть приложение с navcontroller, созданное в appdel. Каждый введенный vc содержит блок кода в viewdidload, который настраивает панель инструментов. Панель инструментов всегда одна и та же. Есть ли способ для меня просто создать этот код один раз — и не помещать его в каждый vc?
[self.navigationItem setHidesBackButton:YES];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Home" style:UIBarButtonItemStyleBordered target:self action:@selector(backClicked)];
UIBarButtonItem *flexibleSpaceLeft = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *storyBtnItem = [[UIBarButtonItem alloc]initWithTitle:@"Sto" style:UIBarButtonItemStyleBordered target:self action:@selector(toolbarControl:)];
storyBtnItem.tag = 1;
UIBarButtonItem *renderBtnItem = [[UIBarButtonItem alloc]initWithTitle:@"Ren" style:UIBarButtonItemStyleBordered target:self action:@selector(toolbarControl:)];
renderBtnItem.tag = 2;
UIBarButtonItem *amenBtnItem = [[UIBarButtonItem alloc]initWithTitle:@"Ame" style:UIBarButtonItemStyleBordered target:self action:@selector(toolbarControl:)];
amenBtnItem.tag = 3;
UIBarButtonItem *availBtnItem = [[UIBarButtonItem alloc]initWithTitle:@"Availability" style:UIBarButtonItemStyleBordered target:self action:@selector(toolbarControl:)];
availBtnItem.tag = 4;
UIBarButtonItem *eopBtnItem = [[UIBarButtonItem alloc]initWithTitle:@"Eq" style:UIBarButtonItemStyleBordered target:self action:@selector(toolbarControl:)];
eopBtnItem.tag = 5;
UIBarButtonItem *stkBtnItem = [[UIBarButtonItem alloc]initWithTitle:@"St" style:UIBarButtonItemStyleBordered target:self action:@selector(toolbarControl:)];
stkBtnItem.tag = 6;
UIBarButtonItem *movBtnItem = [[UIBarButtonItem alloc]initWithTitle:@"Fi" style:UIBarButtonItemStyleBordered target:self action:@selector(toolbarControl:)];
movBtnItem.tag = 7;
NSArray *items = [NSArray arrayWithObjects:flexibleSpaceLeft, stoBtnItem, reBtnItem, ameBtnItem, avaBtnItem, eBtnItem, stBtnItem, mvBtnItem, nil];
[self setToolbarItems:items];
[self.navigationController.toolbar setTintColor:[UIColor colorWithRed:79.0/255.0 green:145.0/255.0 blue:205.0/255.0 alpha:1.0]];
Ответ №1:
Просто сделайте vc.toolbarItems = self.toolbarItems
(где vc
должен быть установлен контроллер представления) в методе, в котором вы нажимаете следующий контроллер представления.
например:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIViewController *vc = [UIViewController new];
vc.toolbarItems = self.toolbarItems
[self.navigationController pushViewController:vc animated:YES];
[vc release]; // if not using ARC
}
Кроме того, вам не нужно делать это в -viewDidLoad
методе, настройка элементов навигации и панели инструментов не требует загрузки представления и, таким образом, может быть выполнена в вашем методе init
или awakeFromNib
. Если вы сделаете это в -viewDidLoad
, вы потенциально устанавливаете элементы несколько раз.
Ответ №2:
Обычно я справляюсь с подобными вещами так: создаю базовый контроллер представления, а код для настройки панели инструментов будет находиться в базовом контроллере представления, а все остальные контроллеры представления наследуются от этого базового контроллера.
Ответ №3:
Вы могли бы создать абстрактный подкласс для ваших ViewControllers, который имеет эту функцию в своем viewDidLoad. Затем вы просто настраиваете его в одном месте.
Например, создайте класс контроллера представления с именем myMasterViewController. Все, что вам нужно настроить в нем, — это viewDidLoadMethod. Затем в других ваших контроллерах сделайте так, чтобы они наследовали от myMasterViewController вместо UIViewController. Убедитесь, что у вас есть [super viewDidLoad];
в других ваших VC.