Sementara viewWillAppear()
dan viewDidDisappear()
yang disebut ketika tombol kembali disadap, mereka juga disebut di lain waktu. Lihat akhir jawaban untuk lebih lanjut tentang itu.
Menggunakan UIViewController.parent
Mendeteksi tombol kembali lebih baik dilakukan ketika VC dihapus dari induknya (NavigationController) dengan bantuan willMoveToParentViewController(_:)
ORdidMoveToParentViewController()
Jika induknya nihil, pengontrol tampilan akan dikeluarkan dari tumpukan navigasi dan ditutup. Jika induk bukan nol, itu akan ditambahkan ke tumpukan dan disajikan.
-(void)willMoveToParentViewController:(UIViewController *)parent {
[super willMoveToParentViewController:parent];
if (!parent){
}
}
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
if parent == nil {
}
}
Swap keluar willMove
untuk didMove
dan cek self.parent untuk melakukan pekerjaan setelah pengontrol tampilan diberhentikan.
Menghentikan penutupan
Perhatikan, memeriksa induk tidak memungkinkan Anda untuk "menjeda" transisi jika Anda perlu melakukan semacam penyimpanan asinkron. Untuk melakukan itu, Anda dapat menerapkan yang berikut ini. Satunya downside di sini adalah Anda kehilangan tombol kembali bergaya / animasi iOS yang mewah. Berhati-hatilah juga di sini dengan gerakan gesek interaktif. Gunakan yang berikut untuk menangani kasus ini.
var backButton : UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.interactivePopGestureRecognizer.enabled = false
self.navigationItem.setHidesBackButton(true, animated: false)
self.backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
self.navigationItem.leftBarButtonItem = backButton
}
func goBack() {
self.navigationItem.leftBarButtonItem = nil
someData.saveInBackground { (success, error) -> Void in
if success {
self.navigationController?.popViewControllerAnimated(true)
self.navigationController?.interactivePopGestureRecognizer.enabled = true
}
else {
self.navigationItem.leftBarButtonItem = self.backButton
}
}
}
Lebih lanjut tentang tampilan akan / memang muncul
Jika Anda tidak mendapatkan viewWillAppear
viewDidDisappear
masalah, mari kita lihat contoh. Katakanlah Anda memiliki tiga pengontrol tampilan:
- ListVC: Tampilan tabel hal-hal
- DetailVC: Detail tentang suatu hal
- SettingsVC: Beberapa opsi untuk sesuatu
Mari kita ikuti panggilan di detailVC
saat Anda pergi dari listVC
ke settingsVC
dan kembali kelistVC
List> Detail (push detailVC) Detail.viewDidAppear
<- muncul
Detail> Settings (push settingsVC) Detail.viewDidDisappear
<- menghilang
Dan saat kita kembali ...
Settings> Detail (pop settingsVC) Detail.viewDidAppear
<- muncul
Detail> List (pop detailVC) Detail.viewDidDisappear
<- menghilang
Perhatikan bahwa viewDidDisappear
dipanggil beberapa kali, tidak hanya saat mundur, tetapi juga saat maju. Untuk operasi cepat yang mungkin diinginkan, tetapi untuk operasi yang lebih kompleks seperti menyimpan panggilan jaringan, mungkin tidak.