Я застрял, пытаясь настроить кнопку UINavigationController
.
В RootViewController я установил self.title в viewDidLoad
, и эта строка появляется в панели навигации. В -didSelectRowAtIndexPath
я создаю дочерний контроллер вида, настраиваю кнопку возврата и вызываю -pushViewController
. Обработка для дочерних элементов поместит дочерние view-контроллеры в стек; Мне нужна кнопка назад, чтобы перейти к начальному виду, так же, как при возврате из первого дочернего контроллера вида. На текущей кнопке появится всплывающее окно с предыдущим представлением, поэтому, если в стеке находятся 5 контроллеров дочерних представлений, мне придется нажать кнопку «Назад» 5 раз, чтобы перейти к корневому представлению.
Я не могу заставить действие отключиться, когда отображается кнопка «Назад». Я могу popToRootViewController
, когда в детском ВК; однако кнопка теперь отображается в корневом представлении (!), и мне приходится нажимать кнопку еще раз, чтобы восстановить исходный заголовок и удалить кнопку.
Вот часть root -viewDidLoad
:
- (void)viewDidLoad {
self.title = @"My Nav Bar Title"; // displays on root navigation bar title
// some setup code...
[super viewDidLoad];
}
Вот часть -didSelectRowAtIndexPath
, где при выборе ячейки табличного представления дочернее представление помещается в стек:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
ChildVC *child = [[ChildVC alloc]
initWithNibName:@"Child"
bundle:nil];
[self.navigationController dismissModalViewControllerAnimated:YES];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Quiz" style:UIBarButtonItemStylePlain target:self action:@selector(backToMenu)];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
[self.navigationController pushViewController:child
animated:YES];
[child release];
}
Вот метод действия, который не срабатывает при нажатии кнопки:
-(void)backToMenu {
NSLog(@" in root backToMenu");
[self.navigationController popViewControllerAnimated:YES];
}
ChildVC также создаст нового дочернего элемента в -didSelectRowAtIndexPath
и выдвинет новый дочерний контроллер в качестве следующей дочерней «страницы»:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
Child *newChild = [[Child alloc]
initWithNibName:@"Child"
bundle:nil];
[self.navigationController dismissModalViewControllerAnimated:YES];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
self.title = self.quizString; // child view correctly displays customized title
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle:@"Quiz"
style:UIBarButtonItemStylePlain
target:self
action:@selector(backToMenu)];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
[self.navigationController pushViewController:newQuestion
animated:YES];
[newChild release];
}
В Child -viewWillDisappear
Я установил глобальную переменную, чтобы я знал, когда нужно выдвинуть нового потомка, а когда вернуться к корню:
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:YES];
if (startOver) {
[self backToMenu];
}
}
Child -backToMenu:
-(void)backToMenu {
[self.navigationController popToRootViewControllerAnimated:YES];
}
Ниже приведена последовательность действий при нажатии кнопки «Назад» в дочернем режиме:
- Child -viewWillDisappear
вызывается, вызывает -backToMenu
- -backToMenu вызывает popToRootViewControllerAnimated:
- Child -viewWillDisappear
вызывается снова, вызывает -backToMenu
- root -viewWillAppear
вызывается
- управление возвращается в Child -backToMenu
Корневой вид отображается правильно, но панель навигации содержит кнопку «Назад» и заголовок, как будто это был дочерний вид. Нажатие кнопки «Назад» удаляет кнопку «Назад» и восстанавливает первоначальный заголовок.
Как я могу заставить эту работу? В идеале я хотел бы иметь только 1 дочернее представление в стеке, но я не могу понять, как; тогда кнопка «Назад» вернется к корневому виду. Но когда я попробовал это, я получил NSInvalidArgumentException
', причина: «Нажатие на один и тот же экземпляр контроллера представления более одного раза не поддерживается ...» *
Кроме того, есть ли что-то очевидное, почему действие не запускается при нажатии кнопки? Любая помощь очень ценится ... THX