如何以编程方式发送 ONLongPressGesture?

Posted

技术标签:

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

如何向对象发送UILongPressGesture 消息?

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

[button sendActionsForControlEvents: UIControlEventTouchUpInside];

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

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

【问题讨论】:

“向对象发送消息”是什么意思? @iProgrammed 请参阅我重新措辞的问题以进行澄清。 【参考方案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],但使用手势而不是触摸事件。您是在第二句话中说不,这是不可能的吗?

以上是关于如何以编程方式发送 ONLongPressGesture?的主要内容,如果未能解决你的问题,请参考以下文章

如何以与在 Windows 资源管理器中“发送给邮件收件人”相同的方式以编程方式发送电子邮件?

如何以编程方式通过 ios 7+ 中的 mms 发送图像? [关闭]

如何在 android 实时通话期间以编程方式发送 Dtmf 音?

如何以编程方式在 RingCentral 上发送消息?

Gmail:如何以编程方式发送电子邮件

Flutter:如何使用 fcm 以编程方式发送推送通知