Xamarin.ios 刷两下

Xamarin.ios 刷两下,xamarin.ios,swipe,Xamarin.ios,Swipe,我正在使用Monotouch(5.0.4)为Ipad开发一个应用程序。我有一个滑动手势的问题,我希望有人能帮助我,其中滑动手势调用我的目标代理两次 具体情况如下: 在我的UINavigationController中,我在重写的方法ViewDidLoad中推送第一个UIViewController(然后是根)。在这个视图控制器中,我注册了一个滑动手势(左),它在其目标代理中在导航控制器中推送一个新的视图控制器。这也适用于不同视图控制器的多次推送。但是,在按下第一个视图控制器后,右击手势(弹出视图

我正在使用Monotouch(5.0.4)为Ipad开发一个应用程序。我有一个滑动手势的问题,我希望有人能帮助我,其中滑动手势调用我的目标代理两次

具体情况如下: 在我的UINavigationController中,我在重写的方法ViewDidLoad中推送第一个UIViewController(然后是根)。在这个视图控制器中,我注册了一个滑动手势(左),它在其目标代理中在导航控制器中推送一个新的视图控制器。这也适用于不同视图控制器的多次推送。但是,在按下第一个视图控制器后,右击手势(弹出视图控制器)调用其代理两次,并弹出两个视图控制器。这不会发生在根视图控制器中

我在这个简单的课堂上对这个问题做了一个单独的测试。它所做的是为左右滑动注册两个滑动识别器。左滑动推送同一视图控制器的新实例,右滑动弹出该实例。我也尝试过使用选择器而不是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知识来尝试。

你可能早就知道了,但我想出了一个简便的扩展方法

在LoadView调用中:

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

也许LoadView被调用了好几次,创建了不止一个手势识别器?实际上我没有测试过(或者我忘了),但遗憾的是,这并不是问题所在。不过,感谢您的建议:)我认为您可以删除在每个识别器上设置
委托的位置,尽管我认为这不会导致您的问题。你能在GitHub等网站上发布一个快速项目来复制它吗?在左侧滑动时,你可以创建另一个
SwipeTest
,为它分配代理和新目标,而不删除当前目标。这可能是双重触发的原因。尝试在
onswiperright
方法中打印对象的句柄,如果它被触发两次,我不会感到惊讶,但是来自您的
SwipeTest
类的两个不同实例。psycho:我确实尝试过,为它们指定了名称,但两个调用都是同一个实例。