如何以编程方式假冒触摸事件到UIButton?

时间:2010-10-26 22:56:04

标签: ios iphone uibutton touch-event

我正在编写一些单元测试,并且由于这个特定应用程序的性质,我必须尽可能地高出UI链。所以,我想要做的是以编程方式触发按钮按下,就像用户按下GUI中的按钮一样。

(是的,是的 - 我可以只是调用IBAction选择器,但是,这个特定应用程序的性质使得重要的是我假装实际的按钮按下,这样从按钮本身调用IBAction。)

这样做的首选方法是什么?

9 个答案:

答案 0 :(得分:445)

事实证明

[buttonObj sendActionsForControlEvents: UIControlEventTouchUpInside];
在这种情况下,

正好得到了我所需要的。

编辑:不要忘记在主线程中执行此操作,以获得类似于用户按下的结果。


对于Swift 3:

buttonObj.sendActions(for: .touchUpInside)

答案 1 :(得分:49)

Swift的答案更新

buttonObj.sendActionsForControlEvents(.TouchUpInside)

编辑:已针对Swift 3进行了更新

buttonObj.sendActions(for: .touchUpInside)

答案 2 :(得分:6)

如果你想进行这种测试,你会喜欢iOS 4中的UI自动化支持。你可以很容易地编写JavaScript来模拟按键等,尽管文档(尤其是入门部分)有点稀疏。

答案 3 :(得分:5)

在这种情况下,UIButton来自UIControl。这适用于从UIControl派生的对象。

我想在特定用例上重复使用“UIBarButtonItem”操作。在此,UIBarButtonItem不提供方法sendActionsForControlEvents:

但幸运的是,UIBarButtonItem具有目标&的属性。动作。

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

此处rightBarButtonItem的类型为UIBarButtonItem

答案 4 :(得分:3)

对于Xamarin iOS

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);

Reference

答案 5 :(得分:3)

斯威夫特3:

self.btn.sendActions(for: .touchUpInside)

答案 6 :(得分:1)

这对于编写没有UI测试的单元测试的人很方便;-)

快速解决5种方法来解决UIBarButtonItem的问题,sendAction没有UIButton等的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) } } 方法。

let action = UIBarButtonItem(title: "title", style: .done, target: self, action: #selector(doSomething))
action.sendAction()

现在您可以简单地:

const array = [
    { foo: NaN, test: 'String' },
    { foo: 2, test: '' },
    { foo: 3, test: 'Something' },
]


array.filter(item => Object.values(item).reduce((acc, value) => acc && value), true)

答案 7 :(得分:1)

斯威夫特 5:

class ViewController: UIViewController {
    @IBOutlet weak var theTextfield: UITextField!
    @IBOutlet weak var someButton: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        theTextfield.text = "Pwd"
        someButton.sendActions(for: .touchUpInside)
    }

    @IBAction func someButtonTap(_ sender: UIButton) {
        print("button tapped")
    }
}

答案 8 :(得分:0)

迅速4:

self .yourButton(self)