簡體   English   中英

如何以編程方式將觸摸事件偽造為 UIButton?

[英]how to programmatically fake a touch event to a UIButton?

我正在編寫一些單元測試,並且由於這個特定應用程序的性質,我盡可能地在UI鏈上處於高位非常重要。 所以,我想做的是以編程方式觸發按鈕按下,就好像用戶按下了GUI的按鈕一樣。

(是的,是的——我可以只調用IBAction選擇器,但同樣,這個特定應用程序的性質使得我偽造實際按鈕按下很重要,這樣IBAction可以從按鈕本身調用。)

這樣做的首選方法是什么?

事實證明

[buttonObj sendActionsForControlEvents:UIControlEventTouchUpInside];

在這種情況下,我得到了我需要的東西。

編輯:不要忘記在主線程中執行此操作,以獲得類似於用戶按下的結果。


對於 Swift 3:

buttonObj.sendActions(for: .touchUpInside)

Swift 這個答案的更新

buttonObj.sendActionsForControlEvents(.TouchUpInside)

編輯:為 Swift 3 更新

buttonObj.sendActions(for: .touchUpInside)

斯威夫特 3:

self.btn.sendActions(for: .touchUpInside)

如果你想做這種測試,你會喜歡 iOS 4 中的 UI 自動化支持。你可以很容易地編寫 JavaScript 來模擬按鈕按下等,盡管文檔(尤其是入門部分)有點稀疏。

在這種情況下, UIButton派生自UIControl 這適用於派生自UIControl對象。

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

但幸運的是, UIBarButtonItem具有目標和動作的屬性。

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

這里, rightBarButtonItemUIBarButtonItem類型。

對於 Xamarin iOS

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);

參考

這對於編寫沒有 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()

斯威夫特 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")
    }
}

斯威夫特 4:

self .yourButton(self)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM