Saya berjuang untuk menemukan solusi yang baik untuk masalah ini. Dalam -viewWillDisappear:
metode pengontrol tampilan , saya perlu menemukan cara untuk menentukan apakah itu karena pengontrol tampilan didorong ke tumpukan pengontrol navigasi, atau apakah itu karena pengontrol tampilan menghilang karena telah muncul.
Saat ini saya sedang mengatur bendera seperti isShowingChildViewController
itu tetapi ini menjadi cukup rumit. Satu-satunya cara saya pikir saya bisa mendeteksinya adalah dalam -dealloc
metode.
ios
iphone
cocoa-touch
uiviewcontroller
uikit
Air Terjun Michael
sumber
sumber
viewWillAppear
dan tampaknya apakah pengontrol tampilan diungkapkan dengan didorong atau sesuatu di atasnya yang muncul, Array viewControllers sama di kedua sisi! Ada ide?viewDidLoad
karena hanya dipanggil sekali! Hmm, yang rumit!![viewControllers containsObject:self]
bukan[viewControllers indexOfObject:self] == NSNotFound
? Pilihan gaya?-isMovingFromParentViewController
Metode yang disebutkan di bawah ini memungkinkan Anda untuk menguji apakah tampilan dimunculkan secara eksplisit.Menurut saya cara termudah adalah:
- (void)viewWillDisappear:(BOOL)animated { if ([self isMovingFromParentViewController]) { NSLog(@"View controller was popped"); } else { NSLog(@"New view controller was pushed"); } [super viewWillDisappear:animated]; }
Cepat:
override func viewWillDisappear(animated: Bool) { if isMovingFromParent { print("View controller was popped") } else { print("New view controller was pushed") } super.viewWillDisappear(animated) }
sumber
Dari Dokumentasi Apple di UIViewController.h:
Jadi ya, satu-satunya cara yang didokumentasikan untuk melakukan ini adalah dengan cara berikut:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ([self isBeingDismissed] || [self isMovingFromParentViewController]) { } }
Versi Swift 3:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if self.isBeingDismissed || self.isMovingFromParentViewController { } }
sumber
Jika Anda hanya ingin tahu apakah pandangan Anda semakin muncul, saya hanya menemukan bahwa
self.navigationController
adalahnil
diviewDidDisappear
, ketika dihapus dari tumpukan pengendali. Jadi itulah tes alternatif sederhana.(Ini saya temukan setelah mencoba semua jenis perubahan lain. Saya terkejut tidak ada protokol pengontrol navigasi untuk mendaftarkan pengontrol tampilan agar diberi tahu saat muncul. Anda tidak dapat menggunakan
UINavigationControllerDelegate
karena itu benar-benar berfungsi tampilan nyata.)sumber
Cepat 4
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if self.isMovingFromParent { //View Controller Popped } else { //New view controller pushed } }
sumber
Di Swift:
override func viewWillDisappear(animated: Bool) { if let navigationController = self.navigationController { if !contains(navigationController.viewControllers as! Array<UIViewController>, self) { } } super.viewWillDisappear(animated) }
sumber
Saya menemukan dokumentasi Apple tentang hal ini sulit untuk dipahami. Ekstensi ini membantu melihat status di setiap navigasi.
extension UIViewController { public func printTransitionStates() { print("isBeingPresented=\(isBeingPresented)") print("isBeingDismissed=\(isBeingDismissed)") print("isMovingToParentViewController=\(isMovingToParentViewController)") print("isMovingFromParentViewController=\(isMovingFromParentViewController)") } }
sumber
Terima kasih @Bryan Henry, Masih bekerja di Swift 5
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if let controllers = navigationController?.children{ if controllers.count > 1, controllers[controllers.count - 2] == self{ // View is disappearing because a new view controller was pushed onto the stack print("New view controller was pushed") } else if controllers.firstIndex(of: self) == nil{ // View is disappearing because it was popped from the stack print("View controller was popped") } } }
sumber
Pertanyaan ini cukup lama tetapi saya melihatnya secara tidak sengaja jadi saya ingin memposting praktik terbaik (afaik)
Anda bisa melakukannya
if([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) // view controller popped }
sumber
Ini berlaku untuk iOS7 , tidak tahu apakah itu berlaku untuk yang lain. Dari apa yang saya tahu,
viewDidDisappear
tampilan sudah muncul. Yang berarti ketika Anda melakukan kueri,self.navigationController.viewControllers
Anda akan mendapatkan filenil
. Jadi periksa saja apakah itu nihil.TL; DR
- (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; if (self.navigationController.viewControllers == nil) { // It has been popped! NSLog(@"Popped and Gone"); } }
sumber
Segues bisa menjadi cara yang sangat efektif untuk menangani masalah ini di iOS 6+. Jika Anda telah memberikan pengenal pada segmen tertentu di Interface Builder, Anda dapat memeriksanya di
prepareForSegue
.- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"LoginSegue"]) { NSLog(@"Push"); // Do something specific here, or set a BOOL indicating // a push has occurred that will be checked later } }
sumber
Saya berasumsi maksud Anda bahwa tampilan Anda sedang dipindahkan ke tumpukan pengontrol navigasi dengan mendorong tampilan baru saat Anda mengatakan didorong ke tumpukan. Saya akan menyarankan menggunakan
viewDidUnload
metode untuk menambahkanNSLog
pernyataan untuk menulis sesuatu ke konsol sehingga Anda dapat melihat apa yang sedang terjadi, Anda mungkin ingin menambahkanNSLog
keviewWillDissappeer
.sumber
Berikut adalah kategori untuk mencapai hal yang sama dengan jawaban sbrocket:
Header:
#import <UIKit/UIKit.h> @interface UIViewController (isBeingPopped) - (BOOL) isBeingPopped; @end
Sumber:
#import "UIViewController+isBeingPopped.h" @implementation UIViewController (isBeingPopped) - (BOOL) isBeingPopped { NSArray *viewControllers = self.navigationController.viewControllers; if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) { return NO; } else if ([viewControllers indexOfObject:self] == NSNotFound) { return YES; } return NO; } @end
sumber