Хоча viewWillAppear()
і viewDidDisappear()
будуть викликатися , коли кнопка назад зливають, вони також називаються в інший час. Докладніше про це див. У кінці відповіді.
Використання UIViewController.parent
Визначення кнопки "назад" краще робити, коли вимкнений ПК від його батьківського (NavigationController) за допомогою willMoveToParentViewController(_:)
АБОdidMoveToParentViewController()
Якщо батьківське значення дорівнює нулю, контролер перегляду вискакує з навігаційного стеку та звільняється. Якщо батько не дорівнює нулю, він додається до стеку та подається.
// Objective-C
-(void)willMoveToParentViewController:(UIViewController *)parent {
[super willMoveToParentViewController:parent];
if (!parent){
// The back button was pressed or interactive gesture used
}
}
// Swift
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
if parent == nil {
// The back button was pressed or interactive gesture used
}
}
Вивантажити willMove
для didMove
і перевірки self.parent зробити роботу після того, як контролер зору звільнений.
Припинення звільнення
Зверніть увагу, перевірка батьків не дозволяє "призупинити" перехід, якщо вам потрібно зробити якесь збереження асинхронізації. Для цього можна реалізувати наступне. Єдиним недоліком тут є те, що ви втрачаєте вигадливу кнопку iOS в стилі iOS. Також будьте обережні тут з інтерактивним жестом пальцем. Використовуйте наступне для розгляду цього випадку.
var backButton : UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
// Disable the swipe to make sure you get your chance to save
self.navigationController?.interactivePopGestureRecognizer.enabled = false
// Replace the default back button
self.navigationItem.setHidesBackButton(true, animated: false)
self.backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
self.navigationItem.leftBarButtonItem = backButton
}
// Then handle the button selection
func goBack() {
// Here we just remove the back button, you could also disabled it or better yet show an activityIndicator
self.navigationItem.leftBarButtonItem = nil
someData.saveInBackground { (success, error) -> Void in
if success {
self.navigationController?.popViewControllerAnimated(true)
// Don't forget to re-enable the interactive gesture
self.navigationController?.interactivePopGestureRecognizer.enabled = true
}
else {
self.navigationItem.leftBarButtonItem = self.backButton
// Handle the error
}
}
}
Детальніше про перегляд з'явиться / все-таки з’явиться
Якщо ви цього не отримали viewWillAppear
viewDidDisappear
проблему, розглянемо приклад. Скажімо, у вас є три контролери перегляду:
- ListVC: табличний вигляд речей
- ДеталіVC: подробиці про річ
- НалаштуванняVC: деякі варіанти речі
Дозволяє слідкувати за дзвінками в той час, detailVC
коли ви переходите від пункту listVC
доsettingsVC
і назад доlistVC
Список> Деталі ( деталізація натиснітьVC) Detail.viewDidAppear
<- з'являється
Деталі> Налаштування (натисніть налаштуванняVC) Detail.viewDidDisappear
<- зникають
І коли ми повертаємось назад ...
Налаштування> Деталі (параметри випускуVC) <- Detail.viewDidAppear
з'являються
деталі> Список (деталі випускуVC) Detail.viewDidDisappear
<- зникають
Зауважте, що viewDidDisappear
викликається кілька разів, не тільки при поверненні назад, але і при русі вперед. Для швидкої операції, яка може бути бажаною, але для більш складної операції, як мережевий дзвінок, щоб зберегти, це може не зробити.