Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UILabel中处理触摸事件并将其连接到iAction_Ios_Iphone_Uilabel_Interface Builder_Touch Event - Fatal编程技术网

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

Ios 在UILabel中处理触摸事件并将其连接到iAction,ios,iphone,uilabel,interface-builder,touch-event,Ios,Iphone,Uilabel,Interface Builder,Touch Event,好的,我在interface builder中创建了一个UILabel,它显示一些默认文本“点击开始” 当用户点击UILabel时,我希望它触发iAction方法: -(iAction)下一步它更新标签上的文本以显示新内容。 如果这允许我简单地将一个连接从我的方法拖到我的标签上,然后像使用按钮一样选择“内部润色”,那将非常方便。但是,唉,没有雪茄 所以不管怎样,我想我的问题是,我是否必须将UILabel子类化才能让它工作?或者有什么方法可以在标签上拖动一个按钮,但使其0%不透明。还是我缺少了一个

好的,我在interface builder中创建了一个
UILabel
,它显示一些默认文本“点击开始”

当用户点击
UILabel
时,我希望它触发iAction方法:
-(iAction)下一步它更新标签上的文本以显示新内容。
如果这允许我简单地将一个连接从我的方法拖到我的标签上,然后像使用按钮一样选择“内部润色”,那将非常方便。但是,唉,没有雪茄


所以不管怎样,我想我的问题是,我是否必须将
UILabel
子类化才能让它工作?或者有什么方法可以在标签上拖动一个按钮,但使其0%不透明。还是我缺少了一个更简单的解决方案?

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

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;
在interface builder中设置UILabel的标记值。在ToucheSBegind方法中发生触摸时,请检查标记所属视图的标记值:

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";
通过使用IBOutlet前缀声明UILabel实例变量,可以将类文件中的代码与interface builder中的UILabel对象连接起来:

IBOutlet UILabel *label;

然后在interface builder中,您可以将它们连接起来。

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

查看:

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

诀窍是启用用户交互。

Swift 3

你有一个出口

@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
}

我同意,自定义按钮类型应该给你一个UILabel类型的用户体验。+1,好和简单。我以前尝试过将普通按钮设置为opactiy 0,但不起作用,但是将类型更改为custom的提示非常有效。不透明度将影响按钮及其所有子视图,因此不透明度=0将使整个内容不可见。Yikes。与此线程中的其他解决方案相比,这是一个黑客攻击。如果要识别标签上的点击手势,请在标签上使用点击手势识别器。(看看它读起来是怎么回事?)这是一个非常非常好的解决方案,因为按钮在内部处理触控,而不仅仅是点击(开始)。注意,你必须确保在界面生成器中选中“用户交互启用”,否则这将不起作用。我遇到了一个使用这种方法的问题。直接加载视图控制器时效果很好,但当我创建导航控制器时,将包含标签的控制器推到导航控制器上,然后显示它,触摸似乎不再触及标签。有什么想法吗?如果它是您正在推动的同一个视图控制器类,它应该可以工作。听起来可能还有其他小问题。也许开始另一个问题并发布一些代码一个不需要标签的类似方法就是简单地检查touch.view是否等于您为标签设置的插座。我更喜欢这个,因为这意味着我不必跟踪标签。很好的解决方案。我建议您不要将任何标记设置为0,因为单击其他任何位置的标记值为0。这是因为视图的标记值很可能为0。否则,您可以将视图的标记设置为类似-1的值,然后您可以在其他地方使用标记值0,即一个按钮如果我有多个标签怎么办?如何区分哪一个被点击?@learner尝试标记属性。确保使用labelTap:而不是labelTap。并使用-(void)labelTap:(id)sender@发送者是UITapGestureRecognizer,而不是UILabelTapGestureRecognizer与内部润色不同,因此失去了人机界面的一致性和可访问性。@h4labs您可以使用UITapGestureRecognizer*Tap手势=发送者;然后使用TapSirture.view.tagI获取标签标签,我必须将@objc添加到userDidTapLabel才能使其正常工作。可能是一件很快的事情。