Xamarin.ios 刷两下
我正在使用Monotouch(5.0.4)为Ipad开发一个应用程序。我有一个滑动手势的问题,我希望有人能帮助我,其中滑动手势调用我的目标代理两次 具体情况如下: 在我的UINavigationController中,我在重写的方法ViewDidLoad中推送第一个UIViewController(然后是根)。在这个视图控制器中,我注册了一个滑动手势(左),它在其目标代理中在导航控制器中推送一个新的视图控制器。这也适用于不同视图控制器的多次推送。但是,在按下第一个视图控制器后,右击手势(弹出视图控制器)调用其代理两次,并弹出两个视图控制器。这不会发生在根视图控制器中 我在这个简单的课堂上对这个问题做了一个单独的测试。它所做的是为左右滑动注册两个滑动识别器。左滑动推送同一视图控制器的新实例,右滑动弹出该实例。我也尝试过使用选择器而不是NSAction委托,结果是一样的Xamarin.ios 刷两下,xamarin.ios,swipe,Xamarin.ios,Swipe,我正在使用Monotouch(5.0.4)为Ipad开发一个应用程序。我有一个滑动手势的问题,我希望有人能帮助我,其中滑动手势调用我的目标代理两次 具体情况如下: 在我的UINavigationController中,我在重写的方法ViewDidLoad中推送第一个UIViewController(然后是根)。在这个视图控制器中,我注册了一个滑动手势(左),它在其目标代理中在导航控制器中推送一个新的视图控制器。这也适用于不同视图控制器的多次推送。但是,在按下第一个视图控制器后,右击手势(弹出视图
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:我确实尝试过,为它们指定了名称,但两个调用都是同一个实例。