Проведите жестами дважды - PullRequest
       7

Проведите жестами дважды

0 голосов
/ 03 января 2012

Я разрабатываю приложение для Ipad с использованием Monotouch (5.0.4).У меня есть проблема с жестами смахивания, которая, я надеюсь, кто-то может мне помочь, когда жесты смахивания дважды вызывают моего целевого делегата.

Конкретный случай таков: в моем 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, чтобы попробовать.

1 Ответ

2 голосов
/ 07 июня 2012

Вы, наверное, уже давно поняли это, но вот удобный метод расширения Swipe , который я придумал.

В вызове LoadView:

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