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

Posted

技术标签:

【中文标题】在 UILabel 中处理触摸事件并将其连接到 IBAction【英文标题】:Handling Touch Event in UILabel and hooking it up to an IBAction 【发布时间】:2011-03-11 07:59:38 【问题描述】:

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

当用户点击UILabel 时,我希望它触发 IBAction 方法: -(IBAction)next; 更新标签上的文字以说出新的内容。 如果这允许我简单地将连接从我的方法拖到我的标签上,然后像使用按钮一样选择内部修饰,那将非常方便。但唉,没有雪茄。

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

【问题讨论】:

【参考方案1】:

检查一下:

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

诀窍是启用用户交互。

【讨论】:

如果我有多个标签怎么办?我如何区分哪个被窃听了? @learner 试试 tag 属性。确保使用 labelTap: 而不是 labelTap。并使用 - (void) labelTap:(id)sender;. @thedjaney 发件人是 UITapGestureRecognizer,而不是 UILabel TapGestureRecognizer 与内部修饰不一样,失去了人机界面的一致性和可访问性。 @h4labs 你可以使用 UITapGestureRecognizer *tapGesture = sender;然后使用 tapGesture.view.tag 获取标签标签【参考方案2】:

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;

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

【讨论】:

请注意,您必须确保在界面生成器中选中“启用用户交互”,否则这将不起作用。 我用这种方法遇到了一个问题。当直接加载视图控制器时它工作正常,但是当我创建一个导航控制器时,将包含标签的控制器推送到导航控制器然后显示它,触摸似乎不再到达标签。有什么想法吗? 如果它与您推送的视图控制器类相同,它应该可以工作。听起来可能还有其他一些小问题。也许开始另一个问题并发布一些代码 一种不需要标签的类似方法是简单地检查 touch.view 是否等于您为标签设置的出口。我更喜欢这个,因为这意味着我不必跟踪标签。 很好的解决方案。我建议您不要将任何标记设置为 0,因为单击其他任何位置的标记值都是 0。这是因为您的视图很可能具有标记值 0。否则,您可以将视图的标记设置为像 -1 这样的东西,然后你可以在其他地方使用 0 的标记值,即按钮【参考方案3】:

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

【讨论】:

我同意,自定义按钮类型应该为您提供 UILabel 类型的用户体验。 +1,很好很简单。我之前通过将普通按钮设置为 opactiy 0 来尝试过这个,但它不起作用,但是将类型更改为自定义的提示效果很好。 不透明度将影响按钮及其所有子视图,因此 opacity=0 将使整个事物不可见。 哎呀。与此线程中的其他解决方案相比,这是一个 hack。如果要识别标签上的点击手势,请在标签上使用点击手势识别器。 (看看它是怎么读起来的?) 这是一个好得多的解决方案,因为按钮处理 touchupinside 而不仅仅是点击(开始)。【参考方案4】:

斯威夫特 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

【讨论】:

我必须将@objc 添加到 userDidTapLabel 才能使其正常工作。可能是快速的 4 件事。

以上是关于在 UILabel 中处理触摸事件并将其连接到 IBAction的主要内容,如果未能解决你的问题,请参考以下文章

无法添加插槽并将其连接到按钮

如何将查询参数添加到 BigQuery 并将其连接到 Data Studio?

如何在运行时手动创建服务并将其连接到 typescript Angular 2 中的组件

如何在 Windows 8.1 上安装 SDL 并将其连接到 Visual Studio Community 2013

为啥嵌套视图中的 UILabel 不接收触摸事件/如何测试响应者链?

如何启动本地数据库服务器并将其连接到 Java? [复制]