【问题标题】:How can I send a UILongPressGesture programmatically?如何以编程方式发送 ONLongPressGesture?
【发布时间】:2013-01-18 22:08:33
【问题描述】:

如何向对象发送UILongPressGesture 消息?

我知道如何发送触摸,但不知道手势。例如,如果我想发送一个触摸,我可以使用:

[button sendActionsForControlEvents: UIControlEventTouchUpInside];

按钮会收到“内部修饰”。我需要用长按手势做同样的事情。

考虑自动化 UI 测试。调用与手势关联的选择器不会对任何东西进行有意义的测试。

【问题讨论】:

  • “向对象发送消息”是什么意思?
  • @iProgrammed 请参阅我重新措辞的问题以进行澄清。

标签: ios uigesturerecognizer


【解决方案1】:

导入<UIKit/UIGestureRecognizerSubclass.h> 并根据需要模拟的状态序列手动设置state 属性。这将导致调用添加的目标/动作对。每次手动设置状态后,您必须让运行循环运行才能分发消息。

对于UILongPressGestureRecognizer,为了在实际的“触摸、按住、拖动、释放”手势序列中找到正确的状态序列,我在UIViewController 子类中编写了以下代码@987654325 @.:

UILongPressGestureRecognizer *r = [[UILongPressGestureRecognizer alloc] init];
[self.view addGestureRecognizer:r];
[r addTarget:self action:@selector(recognize:)];
r.state = UIGestureRecognizerStateBegan;
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
r.state = UIGestureRecognizerStateChanged;
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
r.state = UIGestureRecognizerStateEnded;
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
[r reset];

我想这在生产代码中会有风险(您可能希望之后调用reset,但我发现在我的测试中这样做与不这样做之间没有区别),但如果您的用例是自动化测试来验证目标并且操作已正确设置,这可能满足您的需求。

【讨论】:

  • 我仍然有一些时间问题等需要解决,但这让我走上了正确的轨道(并且肯定回答了这个问题)。谢谢!
【解决方案2】:

你知道对象绑定到它的UILongPressGestureRecognizer 的选择器是什么吗?如果你知道,你可以打电话给它。如果你问有没有像touchesMoved:(UITouch *)touch 这样的方法,那么答案是否定的。

【讨论】:

  • 类似于[button sendActionsForControlEvents: UIControlEventTouchUpInside],但使用手势而不是触摸事件。您是在第二句话中说不,这是不可能的吗?
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2011-06-12
  • 2010-11-06
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多