2013-03-20 26 views
6

簡單的故事板設置:帶有UINavigationController的UIViewController。在表格單元格中單擊一個自定義的segue將新的UIViewController推入導航堆棧。都好。但是,然後按導航欄中的「後退」按鈕,它只使用默認的彈出式動畫。通過「返回」按鈕在UINavigationController彈出菜單上放鬆自定義細分

如何讓導航控制器在彈出時使用我的自定義搜索引擎?我添加了

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender 

給兩個視圖控制器,但他們根本不會被調用。

我錯過了什麼?

回答

11

您可以通過創建自定義轉換而不是使用自定義轉換來實現此目的。我花了一段時間才明白,但基本上很簡單。只要確保你的第一個視圖控制器採用UINavigationControllerDelegate協議。然後,仍然在第一視圖中的控制器,實現下面的方法:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController 
           animationControllerForOperation:(UINavigationControllerOperation)operation 
              fromViewController:(UIViewController *)fromVC 
              toViewController:(UIViewController *)toVC 
{ 
return X // where X is an animation Controller object, an instance of the animator class. 
} 

仍然在第一視圖控制器,例如在viewDidLoad中,告訴navigationcontroller第一視圖控制器將作爲其代表作用:

self.navigationController.delegate = self; 

最後但並非最不重要的是,創建一個採用UIViewControllerAnimatedTransitioning協議的動畫類。實現以下方法:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext 

第一種方法保持過渡代碼。點擊後退按鈕時將自動使用此轉換代碼。

這是一個非常簡單的example project

+0

我試圖破解自定義動畫使用故事板天!謝謝 !您的示例項目幫助了很多。 UpVoted! :) – NavinDev 2014-08-19 11:27:51

+0

我將navigationcontroller委託方法添加到導航控制器本身,並將其代理設置爲自身並且它可以工作,因此您不必在堆棧中的每個vc中都執行該過程並使用該協議。 – Arbitur 2015-02-15 10:29:26

+0

@Arbitur我認爲你的這個navigationcontroller是繼承的,並且繼承了堆棧中的所有視圖控制器,對吧?如果不是,你怎麼做你描述的? – Pavan 2015-03-11 17:25:09

2

您是否嘗試過使用類似:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 
{ 
    return [MyCustomSegueInitMethod viewControllerA:vc1 viewControllerB: vcB]; 
} 

我從來沒有一個定製SEGUE,但假設他們所有其他人一樣的工作覆蓋他們的時候,只要您的自定義賽格瑞類繼承的UIStoryBoardSegue做,它應該工作...

然後確保您已將您的後退按鈕鏈接到視圖控制器下方欄中的「退出」圖標。

+0

如上所述,我試過這個,選擇器沒有被調用。也沒有後退按鈕,因爲它來自導航控制器。 – tcurdt 2013-03-20 17:21:03

+1

這是你的問題...... 你需要通過你的後退按鈕創建一個連接touchUpInside事件創建自己的UIButton「後退」按鈕自定義UIToolbar並將其鏈接到退出圖標,並調用開卷()方法。 問題是,如果您使用導航控制器的後退方法,您不能「展開()」。您必須隱藏UINavigation欄並實施您自己的解決方案。 – jpcguy89 2013-03-20 17:22:22

+0

@tcurdt對不起,從上面,它有一的UIBarButtonItem UIToolbar,不是一個UIButton – jpcguy89 2013-03-20 17:28:22

2

展開賽段對於「回滾」賽段非常有用,包括自定義賽段。你的用例中的問題並不在於segse本身,而是因爲你想從後退按鈕中觸發unwind segue。

這就是說,你可以嘗試通過不使用平倉來解決這個問題,但是觸發時,標準後退按鈕被點擊自定義賽格瑞:

// MyDetailViewController.m: 
- (void)viewWillDisappear:(BOOL)animated 
{ 
    if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) { 
     // trigger custom segue (but note that the sourceViewController 
     // has already been removed from the nav controller) 
    } 
    [super viewWillDisappear:animated]; 
} 

這顯然不再有什麼關係展開 - 這只是執行一個自定義的繼續,你實現了「回滾」你用來「推」細節視圖控制器的segue。

讓我知道這是怎麼回事。

+0

觸發自定義的繼續是不回滾賽格。檢查那裏的小信息。你必須創建一些奇怪的IBAction連接,以便回滾工作。 – tcurdt 2013-05-23 10:06:35

+0

是的,你將需要:(1)實現與此簽名'的方法 - (IBAction爲)myUnwindMethod:在你的父視圖控制器(UIStoryboardSegue *)segue',(2)在子視圖控制器一些控制連接到綠色退出(或者從你的案例中手動調用這個方法,因爲你想「劫持」導航控制器的後退按鈕),(3)實現你在問題中提到的兩種方法。 – 2013-05-24 10:10:38

相關問題