代码之家  ›  专栏  ›  技术社区  ›  Bartłomiej Semańczyk

如何手动调用在RxSwift注册的手势识别器?

  •  0
  • Bartłomiej Semańczyk  · 技术社区  · 8 年前

    let recognizer = UITapGestureRecognizer()
    mainView.messagesView.addGestureRecognizer(recognizer)
    _ = recognizer.rx.event.bind { _ in
        self.mainView.dismissKeyboard()
    }.disposed(by: bag)
    

    但现在我需要测试一下:

    func testIfKeyboardIsDismissedAfterMessageViewWasTapped() {
        let view = ThreadView()
        let model = StubThreadViewModel()
        let controller = ThreadViewController(view: view, viewModel: model)
        controller.viewDidLoad()
        let window = UIWindow()
        window.addSubview(view)
        view.textView.becomeFirstResponder()
        XCTAssertTrue(view.textView.isFirstResponder) //TRUE, test passes
        view.messageView. //Here I dont know how to force tap manually
        XCTAssertFalse(view.textView.isFirstResponder) //FALSE, test fails
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   lostInTransit    8 年前

    UIView 有财产 gestureRecognizers 它可以让你得到视图上的所有识别器。你可以用它来改变识别器的状态,这应该有效吗?下面几行

    UIGestureRecognizer *gestureRec = view.messagesView.gestureRecognizers.firstObject;
    gestureRec.state = UIGestureRecognizerStateChanged;
    gestureRec.state = UIGestureRecognizerStateEnded;
    

    编辑-这将只在异步模式下工作,因为事件将在下一个运行循环中触发。看起来是强制和同步触发它的唯一方法(异步测试很糟糕!)可能会被砍掉 this

    注意 -装运时不要使用该代码!