2012-07-31 68 views
3

我在Objective-C中看到了一些关于这个主题的话题。我阅读了其中的很多内容,花了2天的时间试图找到一个解决方案,并没有一个为我工作。我主要用C#编写代码。由于我的问题行为(只在离开/重新输入按钮时触发)和上下文(C#)有点不同。所以,我会在这里问我的问题试试我的机会。Monotouch TouchUpInside不起作用,TouchDown作品

我会尽量保持简单。

下面是代码的示例:

private UIButton _buttonTest; 

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    _buttonTest = new UIButton(new RectangleF(10, 70, 50, 50)); 
    _buttonTest.SetTitle("0", UIControlState.Normal); 
    _buttonTest.TouchUpInside += HandleButtonTestTouchUpInside; 
    _buttonTest.BackgroundColor = UIColor.Red; 
    this.View.AddSubview(_buttonTest); 
} 

void HandleButtonTestTouchUpInside (object sender, EventArgs e) 
{ 
    string textNumber = _buttonTest.Title(UIControlState.Normal); 

    // Increment Number 
    _buttonTest.SetTitle((int.Parse(textNumber)+1).ToString(), UIControlState.Normal); 
} 
  • 有一个按钮和标题文本设置为“0”。
  • 当它的用户点击,它由1

递增数(标题)这个代码通常效果非常好!

然而,它并不在我的一些类的一些未知的原因,工作...

这里的问题是:

  • TouchUpInside不火。 ...但是,如果我用手指按住按钮,并在离开按钮时保持手指,然后重新进入按钮,然后释放按钮,然后....它将触发TouchUpInside,.... so手指需要离开并重新租用按钮,同时按住按钮使TouchUpInside触发。通常,这个代码工作得很好。

事情经过:

  • 如果我更换TouchUpInside通过达阵,然后TouchDown的工作。
  • 对于所有超级视图,“启用了用户交互”设置为True。
  • 所有视图框架(在超级视图中)似乎都在其超级框架内。
  • 我移动了_buttonTest,注意到_buttonTest TouchUpInside在View,SuperView,SuperSuperView ....中没有正确触发,但它在SuperSuperSuperView中正确触发。

有什么建议吗?

+0

您是否尝试过使用Monotouch社区寻求帮助?也许你错过了一个窍门,或者只是在使用错误的事件。你使用'TouchUpInside'表明事件发生在'Touchdown'之后,它不清楚你实际上知道这一点。 – 2012-07-31 17:09:50

+1

我使用'TouchUpInside'进行所有按钮点击(所以这是正确的方法),并没有像你提到的问题。您的按钮上方是否有其他视图可阻止它被点击? – jonathanpeppers 2012-07-31 17:14:49

+0

我没有尝试Monotouch社区,但也许我会很快。我希望我错过了一招,但我想我正在使用正确的事件。是的,我知道TouchUpInside事件出现在TouchDown之后。 – 2012-07-31 17:19:50

回答

2

在SuperSuperView中,我使用了与Button事件冲突输入的轻击手势。

// Tap Gesture 
    UITapGestureRecognizer tapPageGestureRecognizer = new UITapGestureRecognizer(); 
    tapPageGestureRecognizer.AddTarget(this, new Selector ("HandleTapPageGestureRecognizer:"));   
    this.View.AddGestureRecognizer(tapPageGestureRecognizer); 

的想法是禁用的手势SuperSuperView手势时,按钮事件,TouchDown的被解雇了,......当TouchUpInside触发重新启用它。

所以这里是问题的一个解决方案:

private void SetGrandParentViewGestureEnabled(bool enabled) 
{ 
    foreach(UIGestureRecognizer g in this.View.Superview.Superview.GestureRecognizers) 
    { 
     g.Enabled = enabled; 
    } 
} 

void HandleButtonSubmitTouchDown (object sender, EventArgs e) 
{ 
    SetGrandParentViewGestureEnabled(false); 
} 

void HandleButtonSubmitTouchUpInside (object sender, EventArgs e) 
{ 
    // => Do treatments here! 

    SetGrandParentViewGestureEnabled(true); 
} 

不过,我可以使用事件处理程序或操作启用/禁用点击手势。

编辑:这是另一个功能,需要添加以及重新启用手势。

void HandleButtonSubmitTouchUpOutside (object sender, EventArgs e) 
{ 
    SetGrandParentViewGestureEnabled(true); 
} 
+0

谢谢!我很高兴我偶然发现了这一点。对我而言,它适用于iOS6,但不适用于iOS 5.顺便说一句,lambda可以使代码更简洁。例如:myButton.TouchDown + =(object sender,EventArgs e)=> myGesture.Enabled = false; – 2013-07-15 18:52:31

0

我有一个类似的问题,我结束了一起使用自来水识别与长按识别喜欢本作的按钮TopRightButton。

 var longPressGesture = new UILongPressGestureRecognizer(Action); 
      TopRightButton.AddGestureRecognizer(longPressGesture); 

      var tapRecognizer = new UITapGestureRecognizer(); 

      tapRecognizer.AddTarget(() => 
            { 
      //method 
      }); 

      tapRecognizer.NumberOfTapsRequired = 1; 

      this.TopRightButton.AddGestureRecognizer(tapRecognizer); 
private void Action(){ };