Как переопределить кнопку "Назад" только для одного вида (не для всех кнопок назад, присутствующих в разных представлениях), так что при нажатии кнопки "Назад" отображается контроллер корневого представления.
Переопределить кнопку возврата в стеке навигации, сохраняя внешний вид кнопки возврата по умолчанию?
Ответ 1
Вам нужно заменить подкладку и связать обработчик действий:
- (void)viewDidLoad {
[super viewDidLoad];
// change the back button to cancel and add an event handler
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"back"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(handleBack:)];
self.navigationItem.leftBarButtonItem = backButton;
}
- (void)handleBack:(id)sender {
// pop to root view controller
[self.navigationController popToRootViewControllerAnimated:YES];
}
Ответ 2
Нашел решение, которое также сохраняет стиль кнопки "Назад". Добавьте к вашему контроллеру вида следующий метод.
-(void) overrideBack{
UIButton *transparentButton = [[UIButton alloc] init];
[transparentButton setFrame:CGRectMake(0,0, 50, 40)];
[transparentButton setBackgroundColor:[UIColor clearColor]];
[transparentButton addTarget:self action:@selector(backAction:) forControlEvents:UIControlEventTouchUpInside];
[self.navigationController.navigationBar addSubview:transparentButton];
}
Теперь предоставим функциональность по мере необходимости в следующем методе:
-(void)backAction:(UIBarButtonItem *)sender {
//Your functionality
}
Все, что он делает, это закрыть кнопку "Назад" с помощью прозрачной кнопки;)
Ответ 3
Это старый, но правильный ответ таков:
Вместо того, чтобы нажимать ViewController поверх всех остальных, лучше заменить полный стек на rootVC и только на новый VC.
Не:
self.navigationController?.pushViewController(myVc, animated: true)
Но:
let vcStack = self.navigationController?.viewControllers
self.navigationController?.setViewControllers([vcStack![0],myVc], animated: true)
Таким образом, на задней панели будет просто popToRoot, потому что предыдущий viewController в стеке
Ответ 4
У меня была аналогичная проблема, и я успешно использовал ответ Sarasranglt. Вот версия SWIFT.
override func viewDidLoad() {
let transparentButton = UIButton()
transparentButton.frame = CGRectMake(0, 0, 50, 40)
transparentButton.backgroundColor = UIColor.orangeColor()
transparentButton.addTarget(self, action:"backAction:", forControlEvents:.TouchUpInside)
self.navigationController?.navigationBar.addSubview(transparentButton)
}
И функция
func backAction(sender:UIButton) {
// Some sction
}
Ответ 5
Другой подход - принять UINavigationControllerDelegate Протокол.
– navigationController:willShowViewController:animated:
– navigationController:didShowViewController:animated:
Эти методы позволят вам узнать, когда появится контроллер, но вы должны проверить, что контроллер является вашим контроллером.
Ответ 6
Используйте этот код, чтобы показать пользовательскую кнопку "Назад". Обратите внимание на backBarButtonItem
, прежде чем отмечать его как дублирующий ответ.
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"< back"
style:UIBarButtonItemStylePlain
target:self
action:@selector(handleBack:)];
self.navigationItem.backBarButtonItem= backButton;
Ура!