【发布时间】: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