Панель инструментов UINavigationController — закодируйте один раз, не в каждом контроллере просмотра?

#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.