2011-05-23 129 views
54

當視圖加載時,我想看看是否因爲用戶按下了後退按鈕。我該如何檢查?找出用戶是否按下了uinavigationcontroller中的後退按鈕?

+2

你想知道它是否是一個用戶發起彈出或一般大跌眼鏡? – 2011-05-23 01:20:22

+0

闡述你的總體目標可能是件好事。可能有更簡單的方法來做你想做的事情。例如,如果您需要知道某個值是否已更改或設置在第二個視圖中,則應該只檢查該值。 – 2011-05-23 01:53:37

+0

彈出是我想告訴的。 – Andrew 2011-05-23 02:01:12

回答

-7

做到這一點的唯一方法是確保它是後退按鈕,這是爲了創建一個自定義按鈕。如果你不知道該怎麼做,請查看tutorial。它看起來不像普通的後退按鈕,但很接近。如果您需要更多幫助,請發表評論

+1

檢查和其他答案,如果海報讀取這個或許接受,作爲正確的答案 – 2013-05-14 11:43:10

+0

@ user461864,你的意思是其他安德魯,而不是安德魯的其他答案 - 他們是不同的安德魯斯。但你是對的,另一個答案是遠遠優於;目前的比較是一項額外的工作。 – JohnK 2013-06-02 01:20:37

+0

該死的你是對的,..我認爲他回答了兩次很奇怪,但這解釋了 – 2013-06-19 20:40:08

7

UINavigationController具有發出委託回調的delegate屬性。請參閱the iOS reference here

委託沒有「後退按鈕」回調,但它會告訴您什麼時候會出現導航堆棧上的內容。當您按下後,您將頂視圖控制器「彈出」堆棧,因此它會告訴您視圖即將出現。我認爲這是你要找的回調。

你可以有一些簡單的邏輯來檢查它是否是「感興趣」的視圖控制器,然後你可以發送一個通知,等等。

+1

沒有委託顯示何時uinavigationcontroller已經彈出堆棧 – Andrew 2011-05-23 01:43:05

+0

我說UINavigationController有一個委託。如果UINavigationController管理你的視圖層次結構,它確實會回調委託,如果設置。 – makdad 2011-05-23 22:34:55

+0

我正在嘗試這樣做。備份時,不幸的是,它調用了「新的」視圖控制器[備份] - viewWillAppear之前委託方法-navigationController:willShowViewContoller:animated:被調用相同的viewController ... – chadbag 2013-04-21 00:03:48

102

我發現檢測UINavigationController的後退按鈕按鈕(iOS 5.0之前)的最佳解決方案是驗證當前視圖控制器不存在於導航控制器中查看控制器堆棧。

從邏輯上檢查- (void)viewDidDisappear:(BOOL)animated中的這個條件可能更安全一些,在調用方法的時候,視圖控制器很有可能從堆棧中移除。

前的iOS 5.0:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    if (![[self.navigationController viewControllers] containsObject:self]) { 
     // We were removed from the navigation controller's view controller stack 
     // thus, we can infer that the back button was pressed 
    } 
} 

iOS 5.0及您可以使用-didMoveToParentViewController:

- (void)didMoveToParentViewController:(UIViewController *)parent 
{ 
    // parent is nil if this view controller was removed 
} 
+0

這很好用!但是你提到了iOS 5.0以前的版本。有沒有可用於捕獲後退按鈕回調的iOS 5特定方法? – Keller 2012-08-14 21:21:14

+3

我已經更新了我在iOS 5.0中添加的新方法的答案。 – Andrew 2012-08-16 02:28:32

+4

當VC被推送時(至少在iOS 6上),這也會被調用。 – fabian789 2013-01-19 07:20:53

75

在viewWillDisappear方法檢查

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    if ([self isMovingFromParentViewController]) { 
     //specific stuff for being popped off stack 
    } 
} 

這僅是對後的iOS 5

+0

if語句中缺少括號,但否則非常有幫助的答案。謝謝! – AddisDev 2014-01-07 22:43:07

+2

作爲一個替代方案,受Andrew的回答啓發,您可以在移動之前通過覆蓋 'willMoveToParentViewController:'而不是'didMoveToParentViewController:'來做一些事情。 – fatuhoku 2014-03-31 13:09:58

+0

此解決方案不起作用,除非在iOS 8中。 – 2015-01-21 08:46:57

2

這是一個稍微不同的場景,但我認爲解決方案可能會幫助其他人。

在我的情況下,我在UIPopoverController中有一個UINavigationController。我需要檢測用戶是否單擊了後退按鈕,或者在彈出框之外單擊。爲此,我檢查了viewWillDisappear中的visibleViewController屬性。如果在關閉時視圖控制器仍然是visibleViewController,那麼彈出窗口將以另一種方式關閉。如果視圖控制器在關閉時不是visibleViewController,則按下後退按鈕。

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    if (self.navigationController.visibleViewController != self) { 
     <Do something since we're closing using something else> 
    } else { 
     <Do something since we're closing because of the back button> 
    } 
} 

我試過使用zach的解決方案,但isMovingFromParentViewController在兩種情況下均返回true。

我通過了iOS 5+驗證這個工作

我希望這有助於。

1

創建自定義的回欄按鈕和設置目標,

第1步:這些方法添加到您的類

- (void)backButtonClicked :(id)sender{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

- (void)addBackBarButton{ 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    button.frame = CGRectMake(0, 0, 55, 35); 
    [button setTitle:@"back" forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
    self.navigationItem.leftBarButtonItem = customBarItem; 
} 

第2步:致電[自addBackBarButton] in viewDDL加載方法

您將在backButtonClicked方法中獲得操作。你可以用你想要的方式玩它。

乾杯!

2

爲了完整起見,在斯威夫特混合兩種最upwoted答案(12)的:

override func willMoveToParentViewController(parent: UIViewController?) { 
    super.willMoveToParentViewController(parent) 
    if parent == nil { 
     // view controller is popping 
    } 
} 
+0

不要使用'will',使用'did',因爲屏幕邊緣的彈出手勢。 – SoftDesigner 2017-10-14 21:37:48

相關問題