Одним из вариантов будет реализация вашей собственной кнопки возврата. Вам необходимо добавить следующий код в ваш метод viewDidLoad:
- (void) viewDidLoad {
[super viewDidLoad];
self.navigationItem.hidesBackButton = YES;
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(back:)];
self.navigationItem.leftBarButtonItem = newBackButton;
}
- (void) back:(UIBarButtonItem *)sender {
// Perform your custom actions
// ...
// Go back to the previous ViewController
[self.navigationController popViewControllerAnimated:YES];
}
ОБНОВИТЬ:
Вот версия для Swift:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: self, action: "back:")
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
self.navigationController?.popViewControllerAnimated(true)
}
ОБНОВЛЕНИЕ 2:
Вот версия для Swift 3:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
_ = navigationController?.popViewController(animated: true)
}
Замена кнопки на пользовательскую, как указано в другом ответе, возможно, не очень хорошая идея, поскольку вы потеряете поведение и стиль по умолчанию.
Еще один вариант, который у вас есть, - реализовать метод viewWillDisappear на контроллере представления и проверить свойство с именем isMovingFromParentViewController. . Если это свойство имеет значение true, это означает, что View Controller исчезает, потому что он удаляется (выталкивается).
Должно выглядеть примерно так:
В swift 4.2
источник
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if isMovingFromParentViewController { // Your code... } }
viewWillDisappear(animated:)
будет срабатывать, если вы получите телефонный звонок. Это скорее всего не то, что вы хотите. Вероятно, лучше использоватьwillMove(toParentViewController:)
источник
parent == nil
это когда мы возвращаемся наparent
сценуЯ смог добиться этого с помощью следующего:
Свифт 3
Swift 4
Нет необходимости пользовательской кнопки назад.
источник
Я создал этот (быстрый) класс, чтобы создать кнопку «Назад» в точности как обычную, включая стрелку «назад». Он может создать кнопку с обычным текстом или с изображением.
использование
CustomBackButtonClass
(код для рисования стрелки назад, созданный с помощью плагина Sketch & Paintcode)
SWIFT 3.0
источник
Если вы хотите иметь кнопку «Назад» со стрелкой назад, вы можете использовать изображение и код ниже
backArrow.png backArrow@2x.png backArrow@3x.png
источник
Если вы используете,
navigationController
добавьтеUINavigationControllerDelegate
протокол в класс и добавьте метод делегата следующим образом:Этот метод вызывается всякий раз, когда контроллер навигации перемещается на новый экран. Если была нажата кнопка «Назад», новый контроллер представления
ViewController
сам по себе.источник
В Swift 5 и Xcode 10.2
Пожалуйста, не добавляйте пользовательский элемент панели кнопок, используйте это поведение по умолчанию.
Нет необходимости viewWillDisappear , нет необходимости пользовательского BarButtonItem т. Д ...
Лучше определять, когда VC удален из его родителя.
Используйте любую из этих двух функций
Если вы хотите остановить стандартное поведение кнопки «Назад», добавьте пользовательский BarButtonItem.
источник
НЕТ
override func willMove(toParentViewController parent: UIViewController?) { }
Это будет вызвано, даже если вы переходите к контроллеру представления, в котором вы переопределяете этот метод. В какой проверке, если "
parent
"nil
не имеет, не является точным способом быть уверенным, чтобы вернуться к правильномуUIViewController
. Чтобы точно определить,UINavigationController
правильно ли возвращается назад к тому,UIViewController
который представил этот текущий, вам нужно будет выполнитьUINavigationControllerDelegate
протоколу.ДА
примечание:
MyViewController
это просто название того, чтоUIViewController
вы хотите обнаружить, возвращаясь из.1) Вверху вашего файла добавьте
UINavigationControllerDelegate
.2) Добавьте в свой класс свойство, которое будет отслеживать то, от
UIViewController
чего вы переходите.3) в
MyViewController
«SviewDidLoad
метод правопреемника вself
качестве делегата для вашегоUINavigationController
.3) Перед тем как переходить , присвойте предыдущее
UIViewController
как это свойство.4) И соответствовать одному методу
MyViewController
изUINavigationControllerDelegate
источник
В моем случае это
viewWillDisappear
сработало лучше всего. Но в некоторых случаях нужно модифицировать предыдущий контроллер представления. Итак, вот мое решение с доступом к предыдущему контроллеру представления, и оно работает в Swift 4 :источник
Прежде чем покинуть текущий контроллер, мне нужно показать предупреждение. Итак, я сделал это так:
UINavigationController
помощьюUINavigationBarDelegate
Это сработало)
источник
Это не сложно, как мы. Просто создайте рамку для UIButton с чистым фоновым цветом, назначьте действие для кнопки и поместите поверх кнопки навигации на панели навигации. И, наконец, удалите кнопку после использования.
Вот пример кода Swift 3, сделанный с UIImage вместо UIButton
написать код необходимо выполнить
Удалить подпункт после выполнения действия
источник
Swift 4.2:
источник
Свифт 3:
источник
Попробуй это .
Попробуйте это тоже.
источник
просто сделайте control + перетащите элемент панели вниз под func. работать как шарм
источник
Вы можете подкласс
UINavigationController
и переопределитьpopViewController(animated: Bool)
. Помимо возможности выполнения там некоторого кода, вы также можете запретить пользователю возвращаться назад, например, предлагать сохранить или отменить свою текущую работу.Пример реализации, в котором вы можете установить параметр,
popHandler
который устанавливается / очищается с помощью выдвигаемых контроллеров.И пример использования из выдвинутого контроллера, который отслеживает несохраненную работу.
Как приятное прикосновение, это также будет вызвано,
interactivePopGestureRecognizer
когда пользователь пытается вернуться назад, используя жест смахивания.источник
Это мое решение
В вашем контроллере представления вы можете работать так:
источник
Как я понимаю , вы хотите , чтобы опустошить ваш ,
array
как вы жмете кнопку назад и поп - музыки до вашего предыдущегоViewController let
вашего ,Array
который вы загрузили на этом экранеисточник
источник
источник
Для Swift 5 , мы можем проверить это в виду исчезнет
источник
Swift 5 __ Xcode 11.5
В моем случае я хотел сделать анимацию, и когда она закончилась, вернуться назад. Способ перезаписать действие по умолчанию для кнопки «Назад» и вызвать собственное действие:
Или вы можете использовать этот метод один раз, чтобы исследовать иерархию представления NavigationBar и получить индексы для доступа к представлению _UIButtonBarButton, привести к UIControl, удалить target-action и добавить свои собственные target-actions:
источник
Я сделал это путем вызова / переопределения
viewWillDisappear
и затем доступа к стеку,navigationController
как это:источник
Вот как я решил это для своей проблемы
источник
Вот самое простое из возможных решений Swift 5, для которых не требуется создавать пользовательскую кнопку «Назад» и отказаться от всей функциональности левой кнопки UINavigationController, которую вы получаете бесплатно.
Как рекомендует Брэндон А выше, вам необходимо реализовать
UINavigationControllerDelegate
контроллер представления, с которым вы хотите взаимодействовать, прежде чем вернуться к нему. Хороший способ состоит в том, чтобы создать переход, который вы можете выполнить вручную или автоматически, и повторно использовать тот же код из пользовательской кнопки «Готово» или кнопки «Назад».Во-первых, сделайте ваш интересующий контроллер представления (тот, к которому вы хотите обнаружить возвращение) делегатом контроллера навигации в его
viewDidLoad
:Во-вторых, добавьте расширение внизу файла, которое переопределяет
navigationController(willShow:animated:)
Так как ваш вопрос включал в себя
UITableViewController
, я включил способ получить путь индекса строки, которую пользователь коснулся.источник
Вы можете сделать что-то в вашем Viewcontroller, как
Для полного ответа используйте Обнаружение, когда кнопка «назад» нажата на панели навигации.
источник