检测触发 UIControl 动作的事件类型

Posted

技术标签:

【中文标题】检测触发 UIControl 动作的事件类型【英文标题】:Detect what type of event triggered a UIControl's action 【发布时间】:2016-02-17 23:58:22 【问题描述】:

我有一个自定义的UIControl 子类,带有一个操作方法回调。我想在调整时在UILabel 上显示控件元素的值,然后我希望在用户停止调整控件时隐藏标签。

因此,我已经为UIControlEventValueChangedUIControlEventTouchUpInside 连接了操作。两者都成功调用了我的操作方法。但是,要根据操作在此方法中执行不同的操作,我需要知道哪个事件触发了该方法。我怎样才能做到这一点?我查看了UIControl 并没有看到明显的属性。 state 似乎为这两个操作返回 1

所以是这样的:

    - (void)handleSlider1:(CustomSlider*)sender 

        if (sender.state == UIControlEventValueChanged) 
            // code
         else 
            // different code
        
    

【问题讨论】:

【参考方案1】:

您可以通过将它们分别连接到单独的IBActions 来轻松区分这两个事件。然后,每个新操作都会调用您的单个处理程序,并传递适当的 UIControlEvent 值:

- (IBAction)sliderValueChanged:(CustomSlider *)slider

    [self handleSlider1:slider forEvent:UIControlEventValueChanged];   


- (IBAction)sliderValueChanged:(CustomSlider *)slider

    [self handleSlider1:slider forEvent:UIControlEventTouchUpInside];   


- (void)handleSlider1:(CustomSlider *)sender forEvent:(UIControlEvents)event

    if (event == UIControlEventValueChanged)
    //...

【讨论】:

我不确定你为什么认为我需要IBAction。我没有使用任何 IB 功能。只是代码。我最终要做的是在我的UIControl 子类的endTrackingWithTouch: 方法中发送动作UIControlEventTouchCancel。最重要的是(并增加了复杂性),我将控件的主要值设置为 -1 作为我的 viewController 的标记,该操作是 UIControlEventTouchCancel-1 的原因正是因为当一个控制事件触发一个动作方法时,它似乎没有发送信息来识别它是哪个控制事件。 无论是否为 IBAction,您都可以使用此技术。【参考方案2】:

如果您想使用相同的方法来处理这两个事件,那么您可以检查控件的 highlighted 属性:

if (sender.highlighted) 
   // slider is changing value (value changed)
 else 
   // slider has stopped changing value (touch up inside)

或者,您可以简单地创建两个单独的操作方法并将每个事件连接到所需的方法。

【讨论】:

那不是我问的。问题是关于如何检测发送了什么样的操作。 至于对多个UIControl 使用一个回调,我只是使用.tag = 1,2,3,4...

以上是关于检测触发 UIControl 动作的事件类型的主要内容,如果未能解决你的问题,请参考以下文章

UIControl 子类 - 如何停止触摸事件流?

检测 UISlider 何时开始和结束拖动

如何检测同一文件的输入类型=文件“更改”?

QML 定时器

小程序04-事件绑定

自定义 UIControl,动作调用两次