2014-07-23 66 views
0

要求:相同的viewController彈出多次

我想啓用iOS7刷卡備份功能,以自定義導航的後退按鈕項。

實施現狀:

研究了很多之後,我發現下面的解決方案是最好的:

  1. 將手勢識別的代表如下

    self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; 
    
  2. 這造成了這個stackoverflow answer中提到的很多錯誤。爲了避免這種情況,UINavigationController的子類似乎是唯一可行的選擇。我在blog之前通過Keighl這樣做過。

問題:

基本刷卡備份功能工作正常,但奇怪的是,有時,正在被駁回了相同viewController,再次完成了流行的動作後出現。

即假設導航堆棧看起來像A→B。 Popping B將再次調出B。這種情況持續發生,直到最終viewController實際上被取消並且A出現。

這發生在所有viewController對象中的所有視圖,而不僅僅是特定的視圖。 此外,我確保push方法在所有地方只被調用一次。

我也嘗試在每個點記錄導航堆棧,但每個viewController只有一個實例。

注意點:

我需要禁用某些觀點的刷卡功能。我通過將代碼分別寫入disableenable,分別在viewDidAppearviewDidDisappear中執行了刷卡操作。

請提供您寶貴的建議或解決此問題的方法。謝謝!

+0

難道答案實際上適合你? – SwiftArchitect

+0

之後沒有嘗試過。但是現在,我認爲使用View Controller Transitioning API可以實現同樣的效果。 – GoGreen

回答

0

簡短回答:如果你想添加一個彈出手勢,如果不存在,你應該添加一個​​到你的視圖控制器。修改現有的interactivePopGestureRecognizer可能不是正確的方法。這樣做:

[self addGestureRecognizer:({ 
    UIScreenEdgePanGestureRecognizer *gesture = 
     [[UIScreenEdgePanGestureRecognizer alloc] 
     initWithTarget:self action:@selector(pop)]; 
    gesture; 
})]; 

-(void)pop { 
    // pop your view controller here 
} 

龍回答:強制interactivePopGestureRecognizer.delegate什麼傷了你的代碼。

如果需要投自我這樣:

self.navigationController.interactivePopGestureRecognizer.delegate = 
    (id<UIGestureRecognizerDelegate>)self; 

...那是因爲self不是UIGestureRecognizerDelegate。以下應編譯,鏈接,構建和運行,或者你自己設置的麻煩:

self.navigationController.interactivePopGestureRecognizer.delegate = self; 

注意,作爲一個UIGestureRecognizerDelegate特別允許您在運行時調整手勢的行爲,假設你正在執行下列操作之一確保此項修改適用於你自己手勢:

  1. gestureRecognizerShouldBegin:
  2. gestureRecognizer:shouldReceiveTouch:
  3. gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
  4. gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
  5. gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:

通過不斷改變委託,它interactivePopGestureRecognizer你沒有創建的,你正在做的是防止iOS的行爲發生。

documentation

的UINavigationController -interactivePopGestureRecognizer

手勢負責彈出頂部視圖控制器從導航堆棧識別器。 (只讀)

用簡單的英文:使用這個值是你需要將那個手勢和你自己的手勢結合起來。但你不應該修改其行爲:

...您可以使用此屬性檢索手勢識別,並把它綁在用戶界面中的其他手勢識別器的行爲...

+0

嗨。感謝您的詳細解答。你是否意味着如果我將自己的演員陣容轉移到自己身上呢? – GoGreen

+0

不完全。我相信你不應該設置'self.navigationController.interactivePopGestureRecognizer.delegate'。這走錯了方向。當你完全刪除該行時,什麼是**不工作? – SwiftArchitect

+0

好吧。請參閱我的應用中有自定義左欄按鈕項目。當我使用它們時,默認的滑動手勢功能消失了。根據這個[SO回答](http://stackoverflow.com/a/19076323/2954866),將代理設置爲self會啓用它。 – GoGreen

相關問題