2009-03-10 20 views
23

मेरे पास कई UIButton है जो मैं मुख्य क्षेत्र में टैप करते समय वर्तमान क्रिया सेट करने के लिए उपयोग करता हूं। मैं उपयोगकर्ता को बटन से सीधे मुख्य क्षेत्र में खींचने की अनुमति देना चाहूंगा और एक ही कार्रवाई करूँगा; अनिवार्य रूप से, स्पर्शों और बाघों को हटाया जाना चाहिए UIButtons को स्पर्श करते समय मुख्य दृश्य पर भेजा जाना चाहिए, लेकिन बटन प्रेस कार्रवाई भी भेजनी चाहिए।क्या आईफोन पर छूने का कोई तरीका है?

अभी, मेरे पास नियंत्रण बदलने के अंदर स्पर्श है। ड्रैग निकास नियंत्रण सेट करने के लिए अनुभाग के अंदर स्पर्श को कॉल करता है, फिर स्पर्श को मुख्य क्षेत्र स्पर्श करने के संचालन को शुरू करने के लिए अनुभाग शुरू होता है।

हालांकि, इस बिंदु पर, छूटे हुए और छूए हुए अंत में स्पष्ट रूप से नहीं कहा जा रहा है, क्योंकि स्पर्श UIButton पर उत्पन्न हुए थे।

क्या स्पर्शों को आधा अनदेखा करने का कोई तरीका है ताकि वे मुख्य क्षेत्र में पास हो जाएं, लेकिन मुझे पहले नियंत्रण स्थापित करने की अनुमति भी मिलती है?

उत्तर

24

प्रलेखन में, के लिए Responder Objects and the Responder Chain

देखो आप कर सकते हैं "साझा" अप प्रत्युत्तर श्रृंखला स्पर्श अग्रेषित करके वस्तुओं के बीच छूता है। आपके यूआईबटन में एक उत्तरदाता/नियंत्रक है जो यूआईटीच घटनाओं को प्राप्त करता है, मेरा अनुमान यह है कि एक बार जब यह संदेश की अपनी व्याख्या को पूर्ववत करता है तो यह आता है - स्पर्श को संभाला और निपटारा किया गया है।

एप्पल कुछ इस तरह (पाठ्यक्रम के स्पर्श के प्रकार के आधार पर) पता चलता है:

[self.nextResponder touchesBegan:touches withEvent:event];

बल्कि स्पर्श घटना यह पारित हो जाता है के निपटान से।

उप वर्गीकृत UIButton:

MyButton.h

#import <Foundation/Foundation.h> 

@interface MyButton : UIButton { 

} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ; 

@end 

MyButton.m

#import "MyButton.h" 

@implementation MyButton 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    printf("MyButton touch Began\n"); 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
@end 
+0

तो, मैं UIButton उपवर्ग करना होगा, मुझे लगता है? –

+0

सबक्लासिंग आवश्यक नहीं होनी चाहिए, आपको श्रृंखला को थोड़ा सा पता लगाने की आवश्यकता होगी। आपके बटन वाले दृश्य या नियंत्रण श्रृंखला में अगला प्रतिसादकर्ता होगा। – Paxic

+1

मुझे डर है कि मैं यूआईबटन से संदेशों को कैसे फंसाने के लिए नहीं देखता हूं और वास्तव में संदेश प्राप्त करने के लिए UIButton को उप-वर्गीकृत किए बिना उन्हें UIView पर भेजता हूं। –

35

मैं जानता हूँ कि इस सवाल का दो साल पुराना है (और पहले से ही उत्तर), लेकिन फिर भी ...

जब मैंने इसे स्वयं करने की कोशिश की, तो स्पर्शों को अग्रेषित किया गया था, लेकिन बटन अब बटन की तरह व्यवहार नहीं करते थे। मैंने "सुपर" के साथ छूटे भी पारित किए और अब सब ठीक है।

तो, शुरुआती कि इस पर आते हैं हो सकता है, यह क्या कैसा दिखना चाहिए है:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
+0

शानदार! मुझे एक ही समस्या थी और यह हल हो गया! उपरोक्त दिया गया! – EmphaticArmPump

+2

क्या यह विधि यूआईबटन के उप-वर्ग में होगी? –

+1

हां, इसका उपयोग UIButton के उप-वर्ग में किया जाएगा। – daveMac

17

या तो उपवर्ग की आवश्यकता नहीं है! सीधे शब्दों में कुछ और करने से पहले अपने कार्यान्वयन की चोटी पर इस छड़ी: पर छूता है पारित करने के लिए

#pragma mark PassTouch 

@interface UIButton (PassTouch) 
@end 

@implementation UIButton (PassTouch) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 
    [self.nextResponder touchesMoved:touches withEvent:event]; 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 
    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 
    [self.nextResponder touchesCancelled:touches withEvent:event]; 
} 
@end 
इस मामले में
+0

एक आकर्षण की तरह काम करता है :-) बहुत बहुत धन्यवाद! –

+3

बीटीडब्ल्यू अभी भी उपclass की आवश्यकता हो सकती है। उदाहरण के लिए, यदि आपको उन बटनों को मिश्रण करने की आवश्यकता होती है जिन्हें बटन के साथ उसी दृश्य में स्पर्श के साथ पास करने की आवश्यकता होती है, तो किसी कारण से आप उस कार्यक्षमता को नहीं चाहते हैं? जब मैंने पहली बार कोशिश की तो मैंने UIButton पर एक श्रेणी बनाई लेकिन पाया कि मैंने ऊपर बताए गए कारणों से, सबक्लास का उपयोग करना सुरक्षित था, इसलिए मुझे पता है कि जब मैं एक बटन का उपयोग कर रहा हूं जो स्पर्शों को आगे बढ़ाता है। – daveMac

+1

इसके अलावा, आपको 'स्पर्शों को रद्द' के साथ भी ऐसा करना चाहिए। –

संबंधित मुद्दे

 संबंधित मुद्दे