how to programmatically fake a touch event to a UIButton?

后端 未结 8 1760
余生分开走
余生分开走 2020-11-29 15:48

I\'m writing some unit tests and, because of the nature of this particular app, it\'s important that I get as high up the UI chain as possible. So, what I\'d l

相关标签:
8条回答
  • 2020-11-29 16:13

    It turns out that

    [buttonObj sendActionsForControlEvents: UIControlEventTouchUpInside];
    

    got me exactly what I needed, in this case.

    EDIT: Don't forget to do this in the main thread, to get results similar to a user-press.


    For Swift 3:

    buttonObj.sendActions(for: .touchUpInside)

    0 讨论(0)
  • 2020-11-29 16:15

    Swift 4:

    self .yourButton(self)

    0 讨论(0)
  • 2020-11-29 16:16

    For Xamarin iOS

    btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);
    

    Reference

    0 讨论(0)
  • 2020-11-29 16:17

    It's handy for people who write Unit Tests without UI Tests ;-)

    Swift 5 way to solve it for UIBarButtonItem, which does not have sendAction method like UIButton etc.

    extension UIBarButtonItem {
        func sendAction() {
            guard let myTarget = target else { return }
            guard let myAction = action else { return }
            let control: UIControl = UIControl()
            control.sendAction(myAction, to: myTarget, for: nil)
        }
    }
    

    And now you can simply:

    let action = UIBarButtonItem(title: "title", style: .done, target: self, action: #selector(doSomething))
    action.sendAction()
    
    0 讨论(0)
  • 2020-11-29 16:18

    If you want to do this kind of testing, you’ll love the UI Automation support in iOS 4. You can write JavaScript to simulate button presses, etc. fairly easily, though the documentation (especially the getting-started part) is a bit sparse.

    0 讨论(0)
  • 2020-11-29 16:18

    In this case, UIButton is derived from UIControl. This works for object derived from UIControl.

    I wanted to reuse "UIBarButtonItem" action on specific use case. Here, UIBarButtonItem doesn't offer method sendActionsForControlEvents:

    But luckily, UIBarButtonItem has properties for target & action.

     if(notHappy){        
             SEL exit = self.navigationItem.rightBarButtonItem.action;
             id  world = self.navigationItem.rightBarButtonItem.target;
             [world performSelector:exit];
     }
    

    Here, rightBarButtonItem is of type UIBarButtonItem.

    0 讨论(0)
提交回复
热议问题