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 willMoveuntuk didMovedan 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 viewDidDisappearmasalah, 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 detailVCsaat Anda pergi dari listVCke settingsVCdan 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 viewDidDisappeardipanggil 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.