कैसे एक UIButton के लिए एक स्पर्श घटना प्रोग्रामेटिक रूप से नकली करने के लिए?


183

मैं कुछ यूनिट परीक्षण लिख रहा हूँ और, इस विशेष ऐप की प्रकृति के कारण, यह महत्वपूर्ण है कि मैं यथासंभव उच्च UIश्रृंखला प्राप्त करूं । इसलिए, मैं जो करना चाहता हूं वह प्रोग्राम-बटन को ट्रिगर करना है, जैसे कि उपयोगकर्ता ने बटन को दबाया था GUI

(हां, हां - मैं सिर्फ चयनकर्ता को कॉल कर सकता हूं IBActionलेकिन, फिर से, इस विशेष ऐप की प्रकृति यह महत्वपूर्ण बनाती है कि मैं वास्तविक बटन प्रेस को नकली कर दूं, जैसे कि IBActionबटन से ही कॉल किया जाए।)

ऐसा करने का पसंदीदा तरीका क्या है?


क्या आप बता सकते हैं कि यह महत्वपूर्ण क्यों है कि आप सीधे एक्शन विधि को कॉल करने के बजाय बटन टच को नकली बनाते हैं? वास्तव में कोई व्यावहारिक अंतर नहीं है।
जसरीन

1
@ जसारिन: ठीक है, क्योंकि वहाँ एक अंतर है! ;) मेरे ऐप में, कई बटन एक ही एक्शन विधि का उपयोग करते हैं, और विधि यह बताती है कि बटन के टैग के आधार पर कैसे व्यवहार किया जाए। इसलिए इकाई परीक्षण, विधि के माध्यम से एक विशेष कोड-पथ का परीक्षण करने के अलावा, (ए) को उन सभी का परीक्षण करने की आवश्यकता है और (बी) यह भी सत्यापित करता है कि बटन सही ढंग से वायर्ड हैं। इसके अलावा, यह मेरे यूनिट-टेस्ट सूट को अच्छी तरह से एब्सट्रैक्ट करता है, क्योंकि मैं एक टेक्स्ट फाइल में लाइनों के रूप में यूनिट टेस्ट को इस तरह से परिभाषित कर सकता हूं: "1 + 2 = 3" जहां "3" अपेक्षित समाप्ति डिस्प्ले है, और इससे पहले सब कुछ। पुश करने के लिए कौन सा बटन है।
ओली

अच्छी तरह से आपकी कार्रवाई विधि में एक (आईडी) प्रेषक पैरामीटर नहीं है? क्या आप केवल विधि को कॉल नहीं कर सकते और प्रेषक के रूप में बटन पास कर सकते हैं?
जसारीन

3
अपने परीक्षण दोहन का सार प्रकृति के कारण, मैं नहीं पता है कि विधि है कि जरूरतों को एक विशेष बटन के लिए कहा जाता है। मुझे लगता है कि मैं बटन में खुदाई कर सकता हूं और इसे प्राप्त कर सकता हूं, लेकिन SendActionsForControlEvents: यह सब मेरे लिए करता है, त्रुटि के लिए कम अवसर के साथ, और डिजाइन के साथ परीक्षण सार और फिटिंग रखता है।
ओली

जवाबों:


459

परिणाम यह निकला

[buttonObj sendActionsForControlEvents: UIControlEventTouchUpInside];

इस मामले में मुझे जो चाहिए वो मुझे मिला।

संपादित करें: उपयोगकर्ता-प्रेस के समान परिणाम प्राप्त करने के लिए, मुख्य सूत्र में ऐसा करना न भूलें।


स्विफ्ट 3 के लिए:

buttonObj.sendActions(for: .touchUpInside)


जो कॉल करने के लिए अलग नहीं है[myController myActionMethod:myButton1];
जसारीन

11
आप अपनी टिप्पणी प्रतिक्रियाओं में बहुत संयम रखते हैं;)
दान रोसेनस्टार्क

@ जसारिएन काफी अलग है, क्योंकि यह सभी पंजीकृत लक्ष्यों (श्रोताओं) को स्पर्श कार्यक्रम भेजेगा।
htafoya

2
दुर्भाग्य से, इनमें से कोई भी हमेशा काम नहीं करेगा - वे रिसीवर पर एक UIControl होने पर निर्भर करते हैं, जैसे कि एक नल इशारा होने के बजाय।
टूलूजर

1
@ChenLiYong, एक कारण होगा यदि myActionMethod:सार्वजनिक नहीं है, और इसलिए आप इसे सीधे नहीं कह सकते।
इयूलियन ओनोफ्रेई

50

स्विफ्ट के लिए इस जवाब के लिए एक अद्यतन

buttonObj.sendActionsForControlEvents(.TouchUpInside)

संपादित करें : स्विफ्ट 3 के लिए अपडेट किया गया

buttonObj.sendActions(for: .touchUpInside)

1
मैं कहूंगा कि: buttonObj.sendActionsForControlEvents (.TouchUpInside) और भी अधिक स्विफ्ट शैली है;)
सज्जोन

1
मुझे नहीं लगता कि यह काम करेगा अगर बटन XCTestCase में बिना रन लूप सपोर्ट के बनाया गया हो।
कॉपरैश

6

यदि आप इस तरह का परीक्षण करना चाहते हैं, तो आपको आईओएस 4 में यूआई स्वचालन समर्थन पसंद आएगा। आप बटन प्रेस आदि का अनुकरण करने के लिए जावास्क्रिप्ट को आसानी से लिख सकते हैं, हालांकि प्रलेखन (विशेष रूप से शुरू होने वाला हिस्सा) थोड़ा सा है विरल।


1
हाँ, यह अच्छा सामान है, लेकिन मैं इसे ऐप के भीतर से करने की कोशिश कर रहा हूं, न कि इंस्ट्रूमेंट्स के माध्यम से (यदि यही तरीका आपके पास है।)
Olie

इंस्ट्रूमेंट्स आपके ऐप से चलते हैं। ऐप अभी भी चल रहा है, इंस्ट्रूमेंट सिर्फ टचिंग का अनुकरण करता है।
जेफ केली 16

6
मैं इंस्ट्रूमेंट्स को समझता हूं, जेफ - मैं जो कह रहा हूं वह है: मैं चाहता हूं कि मेरी यूनिट-टेस्ट डिवाइस में मेरी जेब में चले जाएं, बिना लैपटॉप या एक्सकोड या इंस्ट्रूमेंट्स के। या क्या आप डिवाइस पर चलने वाले उपकरणों का रहस्य जानते हैं? ;)
ओली

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


यदि आप UIBarButtonItem का उपयोग करते हैं, तो आप बस [आत्म doAction: self.navigationItem.rightBarButtonItem] कर सकते हैं; // - doAction: self.navigationItem.rightBarButtonItem का टॉगल एक्शन नाम है।
c0ming


5

स्विफ्ट 3:

self.btn.sendActions(for: .touchUpInside)

3
यह केवल उच्च स्कोर वाले उत्तरों को दोहरा रहा है।
पांग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.