Trong khi viewWillAppear()
và viewDidDisappear()
được gọi khi nhấn nút quay lại, chúng cũng được gọi vào thời điểm khác. Xem cuối câu trả lời để biết thêm về điều đó.
Sử dụng UIViewControll.parent
Việc phát hiện nút quay lại được thực hiện tốt hơn khi VC bị xóa khỏi cha mẹ của nó (Bộ điều hướng dẫn hướng) với sự trợ giúp của willMoveToParentViewController(_:)
ORdidMoveToParentViewController()
Nếu cha mẹ là con số không, bộ điều khiển khung nhìn sẽ được bật ra khỏi ngăn điều hướng và bị loại bỏ. Nếu cha mẹ không phải là con số không, nó sẽ được thêm vào ngăn xếp và được trình bày.
// 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
}
}
Swap ra willMove
cho didMove
và kiểm tra self.parent để làm việc sau khi bộ điều khiển xem được sa thải.
Dừng việc sa thải
Xin lưu ý, việc kiểm tra cha mẹ không cho phép bạn "tạm dừng" quá trình chuyển đổi nếu bạn cần thực hiện một số loại lưu không đồng bộ. Để làm điều đó bạn có thể thực hiện như sau. Nhược điểm duy nhất ở đây là bạn mất nút quay lại theo kiểu iOS / hoạt hình lạ mắt. Cũng cẩn thận ở đây với cử chỉ vuốt tương tác. Sử dụng như sau để xử lý trường hợp này.
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
}
}
}
Thêm vào xem sẽ / đã xuất hiện
Nếu bạn không gặp viewWillAppear
viewDidDisappear
vấn đề, hãy xem qua một ví dụ. Giả sử bạn có ba bộ điều khiển xem:
- ListVC: Bảng xem mọi thứ
- Chi tiếtVC: Chi tiết về một điều
- Cài đặtVC: Một số tùy chọn cho một thứ
Hãy thực hiện theo các cuộc gọi detailVC
khi bạn đi từ listVC
đến settingsVC
và quay lạilistVC
Danh sách> Chi tiết ( chi tiết đẩyVC) Detail.viewDidAppear
<- xuất hiện
Chi tiết> Cài đặt (cài đặt đẩyVC ) Detail.viewDidDisappear
<- biến mất
Và khi chúng tôi quay lại ...
Cài đặt> Chi tiết (cài đặt popVC) <- Detail.viewDidAppear
xuất hiện
Chi tiết> Danh sách ( chi tiết popVC) Detail.viewDidDisappear
<- biến mất
Lưu ý rằng viewDidDisappear
được gọi nhiều lần, không chỉ khi đi về, mà cả khi đi tiếp. Đối với một hoạt động nhanh chóng có thể được mong muốn, nhưng đối với một hoạt động phức tạp hơn như một cuộc gọi mạng để lưu, thì có thể không.