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


101

好的,所以我UILabel在界面生成器中创建了一个显示“点击开始”的默认文本。

当用户点击时,UILabel我希望它触发IBAction方法:-(IBAction)next;该方法 将更新标签上的文本以表示新内容。
如果这使我能够简单地将连接从方法拖到标签上,然后选择内部修饰(如使用按钮),那将非常方便。但可惜没有雪茄

所以无论如何,我想我的问题是,我是否必须继承该类UILabel才能起作用?还是有某种方法可以在标签上拖动按钮,但使其不透明度为0%。还是我缺少一个更简单的解决方案?

Answers:


255

看看这个:

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];

诀窍是启用用户交互。


1
如果我有多个标签怎么办?我该如何区分被窃听的那一个?
学习者2014年

1
@learner尝试使用tag属性。确保使用labelTap:而不是labelTap。并使用-(void)labelTap:(id)sender;。
thedjaney 2014年

1
@thedjaney发件人是UITapGestureRecognizer,而不是UILabel
h4labs 2015年

TapGestureRecognizer与内部的修饰不同,并且失去了人机界面的一致性和可访问性。

1
@ h4labs可以使用UITapGestureRecognizer * tapGesture =发送者;然后使用tapGesture.view.tag获取标签标签
DJTano

70

UILabel继承自UIView,UIView继承自UIResponder。所有UIresponder对象都可以处理触摸事件。因此,在知道您的视图(包含UIlabel)的类文件中,实现:

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

在界面构建器中,设置UILabel的标签值。当您的touchesBegan方法中发生触摸时,请检查标签所属的视图的标签值:

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

通过声明带有IBOutlet前缀的UILabel实例变量,可以将类文件中的代码与接口构建器中的UILabel对象连接起来:

IBOutlet UILabel *label;

然后在界面生成器中可以将它们连接起来。


31
需要注意的是,您必须确保在界面生成器中选中“已启用用户交互”,否则将无法使用。
2010年

我用这种方法遇到了一个问题。当直接加载视图控制器时,它工作正常,但是当我创建一个导航控制器时,将包含标签的控制器推入导航控制器,然后显示它,触摸似乎不再与标签接触。有任何想法吗?
midas06 2010年

如果它与您要推送的视图控制器类相同,则它应该可以工作。听起来可能还有其他小问题。也许开始另一个问题并发布一些代码
卸妆

5
一种不需要标签的类似方法是简单地检查touch.view是否等于您为标签设置的出口。我更喜欢这样做,因为这意味着我不必跟踪标签。
2011年

很好的解决方案。我建议您不要将任何标签设置为0,因为单击其他任何地方的标签值为0。这是因为您的视图很可能具有0的标签值。否则,您可以将视图的标签设置为像-1之类的东西,然后您可以在其他地方(即按钮)使用0的标记值
kevinl 2013年

30

您可以使用UIButton,使其透明(即没有图像的自定义类型),并在其上添加UILabel(居中)。然后连接正常的按钮事件。


我同意,自定义按钮类型应为您提供UILabel类型的用户体验。
stitz

2
+1,又好又简单。我之前通过将正常按钮设置为opactiy 0进行了尝试,但该按钮不起作用,但是将类型更改为custom的技巧却很完美。
布赖恩·莫斯考

不透明度将影响按钮及其所有子视图,因此不透明度= 0将使整个事物不可见。
Eiko

10
kes 与该线程中的其他解决方案相比,这是一个hack。如果要识别标签上的轻敲手势,请在标签上使用轻敲手势识别器。(看看它的含义如何吗?)
James Boutcher 2013年

这是一个远远更好的解决方案,因为按钮处理的是touchupinside而不是仅仅点击(开始)。

17

迅捷3

您有一个IBOutlet

@IBOutlet var label: UILabel!

在其中启用用户交互并添加手势识别器

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

最后,处理水龙头

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}

2
我必须将@objc添加到userDidTapLabel才能使其正常工作。可能是一件快速的4件事。
符合POSIX的标准
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.