Я разрабатываю приложение для 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, чтобы попробовать.