UITapGestureRecognizer以编程方式触发我视图中的点按

Mat*_* H. 16 uigesturerecognizer ios

编辑:更新以使问题更加明显

编辑2:使问题更准确地解决我的现实问题.我实际上是想采取行动,如果他们在屏幕上的文本字段除外.因此,我不能简单地在文本区域内监听事件,我需要知道他们是否在视图中的任何位置进行了挖掘.

我正在编写单元测试来断言当手势识别器识别出我视图的某些坐标内的点击时,会采取某种动作.我想知道我是否可以通过编程方式创建将由UITapGestureRecognizer处理的触摸(在特定坐标处). 我试图在单元测试期间模拟用户交互.

UITapGestureRecognizer在Interface Builder中配置

//MYUIViewControllerSubclass.m

-(IBAction)viewTapped:(UITapGestureRecognizer*)gesture {
  CGPoint tapPoint = [gesture locationInView:self.view];
  if (!CGRectContainsPoint(self.textField, tapPoint)) {
    // Do stuff if they tapped anywhere outside the text field
  }
}

//MYUIViewControllerSubclassTests.m
//What I'm trying to accomplish in my unit test:

-(void)testThatTappingInNoteworthyAreaTriggersStuff {
  // Create fake gesture recognizer and ViewController
  MYUIViewControllerSubclass *vc = [[MYUIViewControllersSubclass alloc] init];
  UITapGestureRecognizer *tgr = [[UITapGestureRecognizer initWithView: vc.view];

  // What I want to do:
  [[ Simulate A Tap anywhere outside vc.textField ]]
  [[  Assert that "Stuff" occured ]]
}
Run Code Online (Sandbox Code Playgroud)

tig*_*ero 9

我想你有多种选择:

  1. 可能最简单的是发送push event action到您的视图,但我不认为您真正想要的是因为您希望能够选择点击操作发生的位置.

    [yourView sendActionsForControlEvents:UIControlEventTouchUpInside];

  2. 您可以使用UI automation toolXCode仪器提供的.这篇博客解释了如何使用脚本自动化UI测试.

  3. 这个解决方案也解释了如何在iPhone上合成触摸事件,但确保只使用它们进行单元测试.这听起来更像是对我的黑客攻击,如果之前的两点不能满足您的需求,我会将此解决方案视为最后的手段.

  • 选项1无效."sendActionsForControlEvents"仅适用于UIControl对象; 不是UIView的. (24认同)

DCD*_*CDC 6

在单元测试中使用单行触发对 UITapGestureRecognizer 的触摸有一种更简单的方法。假设您有一个包含对点击手势识别器的引用的 var,您只需要以下内容:

singleTapGestureRecognizer?.state = .ended
Run Code Online (Sandbox Code Playgroud)