【问题标题】:Swipe gestures fires twice滑动手势触发两次
【发布时间】:2012-01-03 10:45:02
【问题描述】:

我正在使用 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 的了解,我已经用完了可以尝试的东西。

【问题讨论】:

  • 可能LoadView被调用了多次,创建了多个手势识别器?
  • 我实际上没有测试过(或者我忘记了),但遗憾的是这不是问题。不过感谢您的建议:)
  • 我认为您可以删除在每个识别器上设置Delegate 的位置,尽管我认为这不会导致您的问题。你能在 GitHub 等上发布一个快速的项目来重现这个吗?
  • 在向左滑动时,您创建另一个SwipeTest,为其分配代表和新目标,而不删除当前目标的目标。这可能是双重触发的原因。尝试在 OnSwipeRight 方法中打印对象的句柄,如果它被触发两次,我不会感到惊讶,但来自 SwipeTest 类的两个不同实例。
  • psycho:实际上我试过了,给他们起了名字,但两个电话都是同一个实例。

标签: xamarin.ios swipe


【解决方案1】:

您可能早就想通了,但这是我想出的方便的Swipe 扩展方法。

在 LoadView 调用中:

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

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多