2013-12-17 31 views
16

在視圖控制器上獲取回調或事件是否被interactivePopGestureRecognizer解散(彈出)有乾淨的解決方案嗎?Getting interactivePopGestureRecognizer忽略回調/事件

爲了清楚,我需要一些明確的方法在控制器被這個手勢識別器彈出之前在最上面的控制器(並且沒有其他)被調用。我不希望在導航控制器上發生事件並將事件發送到相應的控制器,我不想使用viewWillAppearviewWillDissapear ...

我最近的做法是將目標/選擇器對添加到手勢只有2個問題。首先,如果控制人員被解僱,我無法獲得直接信息(無論如何,UIGestureRecognizerStateEnded都會被解僱)。第二次控制器解散後,我需要從識別器中移除目標。

原因是我有幾個控制器需要發送一些信息給他們的代表。通過「完成」和「取消」按鈕觸發事件,委託方法被調用,然後控制器被彈出。我需要幾乎相同的情況,儘可能少地改變代碼。

此手勢的另一種情況是拋出警報視圖並回復操作的可能性:當此手勢結束詢問「您確定要取消您的工作」並有用戶時是否有顯示警報視圖的方法選擇控制器是否會彈出或恢復。

+0

有趣的問題。我有一種感覺,你需要禁用'interactivePopGestureRecognizer'並註冊你自己的或使用iOS 7的[交互式轉換](http://www.objc.io/issue-5/view-controller-transitions.html) –

+0

我擔心你可能是對的。似乎很奇怪,這不是一個常見問題。我希望至少在某些時候,至少有一些應用需要實現這一點。關於實現自定義轉換的最糟糕的事情是,您必須明確禁用每個控制器上的手勢,並在彈出(或另一個控制器被按下)後重新啓用它。 –

回答

38

我知道這是舊的,但對於任何其他可能面臨類似問題的人。這是我使用的方法。首先,我向我的導航控制器註冊一個UINavigationControllerDelegate。代表需要執行。

Objective-C的

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

斯威夫特

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) 

所以實施將是這個樣子。

Objective-C的

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
     id<UIViewControllerTransitionCoordinator> tc = navigationController.topViewController.transitionCoordinator; 
     [tc notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
      NSLog(@"Is cancelled: %i", [context isCancelled]); 
    }]; 
} 

斯威夫特

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
    if let coordinator = navigationController.topViewController?.transitionCoordinator() { 
     coordinator.notifyWhenInteractionEndsUsingBlock({ (context) in 
      print("Is cancelled: \(context.isCancelled())") 
     }) 
    } 
} 

回調當用戶舉起她的手指和(Objec-C)[context isCancelled];(雨燕)將觸發context.isCancelled()將返回YES/true如果動畫被反轉(視圖控制器未被彈出),否則NO/falsecontext中有更多的東西可以使用,比如兩個視圖控制器都包含在內,以及發佈後完成的動畫的百分比等。

+1

它不適合「我不想讓導航控制器上的事件發送到適當的控制器」,但仍然非常好。 –

+1

是的,我知道這對你來說並不完美,但如果你嘗試谷歌這種類型的問題,所以它可能適用於某些人,但你的問題是第一個問題之一。從技術上講,你沒有在導航控制器上得到這個,但是在委託上,但是你仍然需要在控制器上調用一個方法。如果您想嘗試一下,可以使用isCancelled來檢查是否要通知,然後使用[context viewControllerForKey:UITransitionContextFromViewControllerKey]來獲取控制器通知。但是,你是對的,這不是你所追求的。 –

+1

實際上是由具有最上面的控制器我可以實現這樣的事情: 如果([TC respondsToSelector:@selector(controllerDismissedByPopGesture :)]){ [TC performSelector:@選擇(controllerDismissedByPopGesture :) withObject:@([背景isCancelled ])]; } 儘管我不太喜歡這種類型的代碼,但它完全符合我的需求。我需要的僅僅是將「 - (void)controllerDismissedByPopGesture:(NSNumber *)isCancelled'添加到任何控制器,然後完成。也許你應該把它添加到你的答案... –