Есть ли способ сохранить кнопку в стеке UINavigationController? - PullRequest
3 голосов
/ 05 марта 2012

Я знаю, как добавить кнопку к каждому контроллеру, который я помещаю в стек контроллера навигации.Но мне всегда нужна кнопка настроек в правом верхнем углу панели навигации, независимо от того, какой контроллер нажимается или выдвигается.Кнопка должна представлять параметры viewController модально.

Для меня включение в viewDidLoad каждого контроллера кода для кнопки плюс включение заголовка контроллера настроек выглядит как хак.

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

Есть идеи, как этого добиться?

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Хорошо, это то, что я сделал:

1 - подкласс UINavigationController и включаю заголовок для моего контроллера настроек

2 - переопределение -pushViewController:aniamted:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [super pushViewController:viewController animated:animated];
    UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc]initWithTitle:@"Settings" 
                                                                      style:UIBarButtonItemStylePlain 
                                                                     target:self
                                                                     action:@selector(shouldPresentSettingsView)];
    [viewController.navigationItem setRightBarButtonItem: settingsButton];
    [settingsButton release];
}

3 - добавить два метода:

- (void)shouldPresentSettingsView
{
    SetupViewController *settingsView = [[SetupViewController alloc] init];
    UINavigationController *tempController = [[UINavigationController alloc]initWithRootViewController:settingsView];
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                                                     style:UIBarButtonItemStylePlain 
                                                                    target:self 
                                                                    action:@selector(shouldDismissSettingsView)];
    settingsView.navigationItem.leftBarButtonItem = cancelButton;
    [self.visibleViewController presentModalViewController:tempController animated:YES];

    [cancelButton release];
    [settingsView release];
    [tempController release];
}

- (void)shouldDismissSettingsView
{
    [self dismissModalViewControllerAnimated:YES];
}
2 голосов
/ 05 марта 2012

Установите делегата вашего контроллера навигации на что-то глобальное, например, делегат приложения. В этом объекте инициализируйте UIBarButtonItem и сохраните в переменной экземпляра:

- (void)setupSettingsButton
{
    settingsBarButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose 
                                                                      target:self 
                                                                      action:@selector(openSettings)];
}

Затем настройте каждый навигационный элемент контроллера представления перед его отправкой:

- (void)navigationController:(UINavigationController *)aNavigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.rightBarButtonItem = settingsBarButton;
}

и обработай действие кнопки ...

- (void)openSettings
{
    [navigationController presentViewController:settingsVC animated:YES completion:NULL];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...