2012-01-03 105 views
0

我正在使用Monotouch(5.0.4)開發Ipad的應用程序。我有一個滑動手勢問題,我希望有人可以幫助我,滑動手勢可以兩次呼叫我的目標代表。滑動手勢觸發兩次

具體的情況是這樣的: 在我的UINavigationController中,我推入了第一個UIViewController(它是根),它被覆蓋的方法ViewDidLoad。在這個視圖控制器中,我註冊了一個滑動手勢(左),在其目標代表中,在導航控制器中推動一個新的視圖控制器。這也適用於多個不同的視圖控制器。但是,在第一個視圖控制器被按下之後,右側滑動手勢(彈出視圖控制器)會調用其委託兩次,並彈出兩個視圖控制器。這在根視圖控制器中不會發生。

我在這個簡單的課上對問題做了一個單獨的測試。它所做的是爲左右滑動註冊兩個滑動識別器。左滑動推動同一個視圖控制器的新實例,並且右滑動彈出它。我已經嘗試使用選擇器而不是NSAction委託,同樣的結果。

public class SwipeTest : UIViewController 
{ 
    public override void LoadView() 
    { 
     base.LoadView(); 

     // Create left swipe recognizer 
     UISwipeGestureRecognizer leftRecognizer = new UISwipeGestureRecognizer(); 
     leftRecognizer.Direction = UISwipeGestureRecognizerDirection.Left; 
     leftRecognizer.Delegate = new UIGestureRecognizerDelegate(); 
     leftRecognizer.AddTarget (new NSAction (OnSwipeLeft)); 
     View.AddGestureRecognizer (leftRecognizer); 

     // Create right swipe recognizer 
     UISwipeGestureRecognizer rightRecognizer = new UISwipeGestureRecognizer(); 
     rightRecognizer.Direction = UISwipeGestureRecognizerDirection.Right; 
     rightRecognizer.Delegate = new UIGestureRecognizerDelegate(); 
     rightRecognizer.AddTarget (new NSAction (OnSwipeRight)); 
     View.AddGestureRecognizer (rightRecognizer); 
    } 

    public override void ViewWillDisappear (bool animated) 
    { 
     base.ViewWillDisappear (animated); 
    } 

    private void OnSwipeLeft() 
    { 
     Console.WriteLine ("swipe left"); 

     NavigationManager.Instance.PushViewController (new SwipeTest(), true); 
    } 

    private void OnSwipeRight() 
    { 
     Console.WriteLine ("swipe right"); 

     NavigationManager.Instance.PopViewControllerAnimated (true); 
    } 
} 

NavigationManager是我的UINavigationController,這是一個單身,但並沒有做很多事情。

public class NavigationManager : UINavigationController 
{ 
    #region Singleton 

    class Nested 
    { 
     static Nested() {} 

     internal static readonly NavigationManager instance = new NavigationManager(); 
    } 

    public static NavigationManager Instance 
    { 
     get { return Nested.instance; } 
    } 

    #endregion 

    #region Private fields 

    private UIViewController firstController; 

    private UIViewController root; 

    #endregion 

    #region Constructor 

    private NavigationManager() 
    { 
     // Set first view 
     //firstController = new InitializationView(); 
     firstController = new SwipeTest(); 
    } 

    #endregion 

    #region Methods 

    public override void ViewDidLoad() 
    { 
     PushViewController (firstController, false); 

     base.ViewDidLoad(); 
    } 

    #endregion 

    #region Properties 

    public UIViewController RootController 
    { 
     get { 
      return root; 
     } 
     set { 
      root = value; 

      ViewControllers = new UIViewController[1] {value}; 
     } 
    } 

    #endregion 
} 

因此,要回顧:左刷卡(推視圖控制器)的作品,右刷卡(彈出一個視圖控制器)的作品第一次同時在根控制器(因此它實際上並沒有做任何事情),但在視圖控制器被推入後(在根控制器之後),右滑動會調用委託兩次。

我希望有人有一個想法,爲什麼會發生這種情況,我用我的Monotouch的知識用盡了嘗試。

+0

可能的loadView被稱爲多次,創建多個手勢識別器? – 2012-01-03 14:30:45

+0

我其實沒有測試過(或我忘了),但可悲的是,這不是問題。感謝您的建議,雖然:) – jub 2012-01-03 15:29:28

+0

我認爲你可以刪除你在每個識別器上設置'Delegate',但我不認爲這會導致你的問題。你可以在GitHub上發佈一個快速項目來重現這一點嗎? – jonathanpeppers 2012-01-04 13:12:33

回答

2

你可能早就想通了,但這裏有一個方便的Swipe擴展方法,我想出了。

在通話的loadView:

View.Swipe(UISwipeGestureRecognizerDirection.Right).Event += (s, r) => 
    new UIAlertView("Swipe Test", "Swipe " + r.Direction.ToString(), null, "Ok") 
     .Show(); 
+0

+1這工作得很好。 – 2013-02-07 03:22:39