Переопределить кнопку возврата в стеке навигации, сохраняя внешний вид кнопки возврата по умолчанию?

Как переопределить кнопку "Назад" только для одного вида (не для всех кнопок назад, присутствующих в разных представлениях), так что при нажатии кнопки "Назад" отображается контроллер корневого представления.

Ответ 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;

Ура!