簡體   English   中英

當按下導航后退按鈕時,將值返回到呈現視圖控制器

[英]Return values to presenting view controller when navigation back button pressed

我在將所有這些拼湊在一起時遇到麻煩。 我有一個視圖控制器,可以打開另一個(將其推送到導航堆棧上)。 在該顯示的視圖控制器上,用戶在文本視圖中輸入一個值。 當用戶在導航中按下后退按鈕時,我希望能夠將他們在文本視圖中輸入的值傳遞回呈現控制器。

我一直在尋找一種使用后退按鈕進行放松搜索的方法,但沒有發現任何東西。 當我(以編程方式)創建后退按鈕時,我使用initWithTitle:style:target:action,但是我不確定在實現action方法時如何能夠訪問所提供的控制器中設置的值。 可能必須使用委托來鏈接兩者,但不能確定此方案的確切集成點。

我覺得我離這里很近,只要有一點幫助,我就可以到達那里。 謝謝!

用於此交互的兩個最常見的模型是子視圖控制器具有委托或完成塊。 可以在prepareForSegue方法中進行設置。 我個人比較喜歡使用完成塊方法,因為它保留了代碼,但包含ymmv。

還有多種模型可以檢測何時關閉子視圖控制器,而您需要調用委托和/或完成:

  1. 使用自定義后退按鈕。 不喜歡這樣做,因為創建確實看起來和行為類似於Apple原始設備的后退按鈕可能是一個問題,尤其是在支持iOS 6和iOS 7的情況下。

  2. 鈎住viewDidDisappear,看看您是否仍在導航控制器的viewControllers數組中。 后退按鈕可以正常工作,這樣更好,但仍然感覺有些曲折。

  3. 使用UINavigationBarDelegate方法navigationBar:shouldPopItem:這很有吸引力,尤其是在您需要進行其他驗證(例如檢查保存/未保存的值)的情況下。 要實現這一點,您必須繼承UINavigationController的子類,並將該方法轉發給子視圖控制器。

編輯:關於選項2的詳細信息:

-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    if(![self.navigationController.viewControllers containsObject:self])
    {
        // We're not still in the navigation stack so we must've been
        //  popped.  If we were pushed, viewDidDisappear would be called
        //  but viewControllers containsObject:self would be true
    }
}

編輯:澄清了選項3:在導航控制器子類中

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
    UIViewController*   top = self.topViewController;
    if([top respondsToSelector:@selector(navigationBar:shouldPopItem:)])
        return [(id)top navigationBar:navigationBar shouldPopItem:item];
    return [super navigationBar:navigationBar shouldPopItem:item];
}

然后,您可以在需要該功能的類中實現navigationBar:shouldPopItem:

后退按鈕實際上並不帶有與其關聯的任何事件,因此您可以在上一個和要彈出的ViewController之間傳遞值。

您將必須實現Delegate模式以傳遞值。 在這種情況下,當您按下backButton時無法捕獲時,您需要使用自定義的leftBarButtonItem或使用本身帶有<的圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM