2012-07-31 63 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(){ };