Переключение между контроллерами представления с навигационным контроллером
Допустим, у меня есть ViewController A с 2 кнопками, каждая из которых переходит к ViewController B и C (одна кнопка для просмотра B, а другая для C). Из ViewController C I переходит к ViewController D. Все ViewController имеют панель навигации, так что из вида B i может вернуться к A, и из вида D я могу вернуться к D->C->A. Проблема в том, что когда я переключаюсь между представлениями от D до B: переход выполняется, но теперь в навигационной панели B я перенастроился, чтобы просмотреть D, и я хочу, чтобы B вернулся к A, как и должно. Каково решение????
1 ответ
Насколько я знаю, это можно сделать двумя способами.
1) Используйте пользовательскую кнопку возврата на контроллере D
2) Измените стек NavigationController, т. Е. NSArray self.navigationController.viewControllers, в классе контроллера D
Использовать пользовательскую кнопку возврата
Вы можете сделать это следующим образом в D controller. Это действительно только в том случае, если контроллер является rootViewController для navigationController. Если вы отслеживаете свой контроллер A, вы также можете использовать следующее
(NSArray *) popToViewController: (UIViewController ) viewController animated: (BOOL) animated
- (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(goBack:)]; self.navigationItem.leftBarButtonItem = backButton; self.navigationItem.hidesBackButton = YES; } -(void)goBack:(id)sender { [self.navigationController popToRootViewControllerAnimated:YES];
}
Изменить стек NavigationController
Это полезно, если вы хотите перейти к определенному контроллеру. Но кнопка "Назад" по-прежнему отображается после возврата к контроллеру A из B, что вам, возможно, придется увидеть себя, внеся некоторые изменения. Не пытайтесь изменить стек навигации в prepareForSegue
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
NSMutableSet *controllersToRemove = [NSMutableSet new];
for (id viewController in controllers) {
if (![viewController isKindOfClass:[self class]]&&![viewController isKindOfClass:[NRViewController class]]) {
[controllersToRemove addObject:viewController];
}
}
for (id controller in controllersToRemove) {
[controllers removeObject:controller];
}
self.navigationController.viewControllers = controllers;
}
Отредактированный код для пользовательской кнопки возврата
Если вы хотите оригинальную кнопку Назад
Вы должны использовать изображение для этого с кодом, как следует
UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 60.0f, 30.0f)];
UIImage *backImage = [[UIImage imageNamed:@"back_button_normal.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12.0f, 0, 12.0f)];
[backButton setBackgroundImage:backImage forState:UIControlStateNormal];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = backButtonItem;