Monotouch TouchUpInside 不工作,TouchDown 工作

Posted

技术标签:

【中文标题】Monotouch TouchUpInside 不工作,TouchDown 工作【英文标题】:Monotouch TouchUpInside does not work, TouchDown works 【发布时间】:2012-07-29 11:53:52 【问题描述】:

我在 Objective-C 中看到了一些关于这个主题的主题。我读了很多,花了 2 天时间试图找到解决方案,但没有一个对我有用。我主要用 C# 编码。由于我的问题行为(仅在离开/重新输入按钮时触发)和上下文(C#)有点不同。所以,我会试试我的机会,在这里问我的问题。

我会尽量保持简单。

这是一个代码示例:

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,......所以手指需要在按住按钮的同时离开并重新租用按钮以使 TouchUpInside 触发。通常,此代码运行良好。

检查的内容:

如果我将 TouchUpInside 替换为 TouchDown,则 TouchDown 可以工作。 所有超级视图的“已启用用户交互”设置为 True。 所有视图框架(在超级视图中)似乎都在它们的超级视图框架内。 我移动了 _buttonTest,发现 _buttonTest TouchUpInside 在 View、SuperView、SuperSuperView 中无法正确触发……但在 SuperSuperSuperView 中却可以正确触发。

有什么建议吗?

【问题讨论】:

您尝试过 Monotouch 社区寻求帮助吗?也许您错过了一个技巧,或者只是使用了错误的事件。您使用TouchUpInside 的事实表明该事件将在Touchdown 之后发生,不清楚您是否真的知道这一点。 我使用TouchUpInside 进行所有按钮点击(所以这是正确的方法),并且没有遇到您提到的问题。按钮顶部的其他视图是否会阻止它被点击? 我还没有尝试过 Monotouch Community,但也许我很快就会尝试。我希望我错过了一个技巧,但我认为我使用了正确的事件。是的,我知道 TouchUpInside 事件出现在 TouchDown 之后。 我也经常使用 TouchUpInside,但这是我第一次遇到这种问题。 ...我会检查我的按钮顶部是否没有其他视图会阻止它被点击.... 好的,我想我找到了问题所在,...按钮和我在 SuperSuperView 中声明的点击手势之间存在冲突。因此,由于在祖父视图上触发了点击手势,因此它似乎取消了按钮中的 TouchUpInside。我会尝试找到一个优雅的解决方案......否则,......我将不得不禁用 TouchDown 中的点击手势,......然后重新启用 TouchUpInside 中的手势。 【参考方案1】:

在 SuperSuperView 中,我的这个点击手势与 Button 事件发生冲突。

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

这个想法是在触发按钮事件 TouchDown 时禁用手势 SuperSuperView 手势......并在触发 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);

但是,我可以使用 EventHandler 或 Action 来启用/禁用点击手势。

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

void HandleButtonSubmitTouchUpOutside (object sender, EventArgs e)

    SetGrandParentViewGestureEnabled(true);

【讨论】:

谢谢!我很高兴我偶然发现了这一点。对我来说,它适用于 ios6,但不适用于 iOS 5。顺便说一句,lambda 可以使代码更简洁。例如:myButton.TouchDown += (object sender, EventArgs e) => myGesture.Enabled = false;【参考方案2】:

我遇到了类似的问题,我最终将点击识别器与长按识别器一起用于按钮 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()  ;

【讨论】:

以上是关于Monotouch TouchUpInside 不工作,TouchDown 工作的主要内容,如果未能解决你的问题,请参考以下文章

在 uipopover 中时,UIButton 不响应 touchupinside

touchUpInside 事件未触发

UIPopoverController w/MonoTouch.Dialog 会导致不需要的弹出框大小调整

C# Monotouch/Xamarin.iOS - 不支持推送导航控制器

Monotouch - 转换到 xCode 4 - XIB 不工作

MonoTouch 项目导致 Application Loader 错误消息“图标尺寸 (0 x 0) 不符合尺寸要求”