IBAction 的不同触摸状态

Posted

技术标签:

【中文标题】IBAction 的不同触摸状态【英文标题】:Different touch states for IBAction 【发布时间】:2014-09-04 12:43:35 【问题描述】:

我记得很清楚,早期版本的 Xcode 提供了在几种不同状态下为 UI 元素连接 IBAction 的选项,例如当用户按下按钮但尚未抬起手指时等。我在 Xcode 中看到的所有内容6 只是一个在按下按钮时触发的 IBAction。

我需要几个按钮上的 IBAction,当用户触摸按钮时,即使没有抬起手指,它也会被调用。有什么方法可以实现吗?

【问题讨论】:

说真的,@SR Nayak,如果每个单个代码字都需要以特殊方式格式化,这是值得怀疑的。但是使用斜体肯定没有任何意义。如果您有格式化的冲动,请使用代码格式化。 【参考方案1】:

您只需选择button并从那里打开connection inspector,您可以根据用户的操作连接多种方法。

或者简单地右键单击按钮并像这样从那里连接它

【讨论】:

啊哈,我现在明白问题所在了!使用 UIButton 会出现这些事件类型。但是对于工具栏或标签栏中的按钮,它们不会。有什么办法可以在工具栏和标签栏中的按钮上工作? @Avalon 如果你想要 UIBarButtonItem 的答案,我可以……但 UITabBarItem 我不能……告诉我。 是的,请告诉我它是如何为 UIBarButtonItem 完成的。无论如何,这是向前迈出的又一步。【参考方案2】:

我认为您要查找的事件是 UIEventTouchDown,无需动动手指。

这是UIControlEvents 上的 Apple 官方文档:

https://developer.apple.com/library/ios/documentation/uikit/reference/uicontrol_class/reference/reference.html#//apple_ref/c/tdef/UIControlEvents

【讨论】:

【参考方案3】:

您可以使用该方法为不同的事件设置不同的IBAction:

addTarget:action:forControlEvents

事件列表: https://developer.apple.com/library/ios/documentation/uikit/reference/UIControl_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIControlEventsenter link description here

苹果文档: https://developer.apple.com/library/ios/documentation/uikit/reference/UIControl_Class/Reference/Reference.html#//apple_ref/occ/instm/UIControl/addTarget:action:forControlEvents:

您也可以通过情节提要选择不同的事件

【讨论】:

【参考方案4】:

根据您的要求,我正在给您写第二个答案

1) 创建一个UIView 子类让我们说MYView 类似这样。

#import "MYView.h"

@implementation MYView

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
    
    return self;


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 




- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 




- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 




- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 




@end

2) 像这样创建UIBarButtonItem(同样的技巧可以应用于UIButton,因为它直接继承自UIView

UIBarButtonItem *yourBBI = [[UIBarButtonItem alloc] initWithCustomView:[[MYView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]];

我们开始...如果您只是触摸(无需松开手指)该方法

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

将被解雇。

希望对你有帮助...

【讨论】:

感谢@Goppinath 的代码示例!但我想知道如果我只在情节提要中定义工具栏及其按钮,即非代码方式,这是否也能以某种方式应用?您使用自定义视图类初始化您的条形按钮项,该类具有触摸状态的处理程序。显然创建 UIAudibleBarButtonItem 的子类并添加例如touchesBegan 处理程序似乎没有削减它。我想知道为什么它在使用自定义视图类初始化时有效,但在扩展 UIAudibleBarButtonItem 类时无效?

以上是关于IBAction 的不同触摸状态的主要内容,如果未能解决你的问题,请参考以下文章

在 UILabel 中处理触摸事件并将其连接到 IBAction

自定义 UIButton 触发 IBAction 一次,然后再也不触发

如何在 iOS 中为不同的 IBAction 赋值?

按钮触摸仅工作一次

将存储在 IBAction 中的值传递给下一个 Nib UITextField。

XCODE 如何跨不同视图使用 IBAction