2009-08-17 10 views
16

मैं अपना खुद का कस्टम नियंत्रण लिखने जा रहा हूं जो UIButton से बहुत अलग है। यह इतना अलग है कि मैंने इसे स्क्रैच से लिखने का फैसला किया। तो मैं सब सबक्लास UIControl है।कस्टम नियंत्रण के लिए लक्ष्य-क्रिया-तंत्र को कैसे कार्यान्वित करें?

जब मेरा नियंत्रण अंदर छू जाता है, तो मैं लक्ष्य-क्रिया के माध्यम से एक संदेश आग लगाना चाहता हूं। उस वर्ग का उपयोगकर्ता इसे तुरंत चालू कर सकता है और फिर इस घटना के लिए कुछ लक्ष्य और क्रियाएं जोड़ सकता है।

यानी कल्पना कीजिए कि मैं आंतरिक रूप से एक विधि -फायर टाइटल्सफोर टचअपएवेंट कहूंगा। मैं अपनी कक्षा में इस लक्ष्य-क्रिया-तंत्र को कैसे बनाए रख सकता हूं? क्या मुझे अपने लक्ष्य में सभी लक्ष्यों और कार्यों को जोड़ना है और फिर फॉर-लूप में लक्षित ऑब्जेक्ट्स पर चयनकर्ताओं (क्रियाएं) को कॉल करना है? या क्या ऐसा करने का एक और बुद्धिमान तरीका है?

मुझे लगता है कि कुछ घटनाओं के लिए लक्ष्य और कार्रवाइयों को जोड़ने के लिए कुछ विधियां प्रदान करने की कल्पना है (जब ऐसा होता है तो मैं आंतरिक विधि को कॉल करके मैन्युअल रूप से उठाता हूं)। कोई उपाय?

+0

द्वारा निर्धारित अनुमत सीमा के भीतर है, आमतौर पर नियंत्रणों में एक लक्ष्य होता है, प्रति ईवेंट एक चयनकर्ता होता है। क्या आपको और चाहिए? –

+0

अगर मैं चाहता था, तो क्या मेरे पास और अधिक हो सकता है? मैं सोचता हूँ हा...लेकिन सुनिश्चित नहीं है कि –

उत्तर

5

आप UIControl उपवर्ग की योजना बना रहे के बाद से, आप बस

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; 

उपयोग कर सकते हैं इस का उपयोग करना, किसी भी वर्ग में ही रजिस्टर कर सकते हैं किसी भी घटना के लिए एक लक्ष्य के रूप में यह आपके कस्टम नियंत्रक पर करना चाहता है।

13

आपके पास सही विचार है। है

@interface TargetActionPair : NSObject 
{ 
    id target; 
    SEL action; 
} 
@property (assign) id target; 
@property (assign) SEL action; 
+ (TargetActionPair *)pairWithTarget:(id)aTarget andAction:(SEL)selector; 
- (void)fire; 
@end 

@implementation TargetActionPair 
@synthesize target; 
@synthesize action; 

+ (TargetActionPair *)pairWithTarget:(id)aTarget andAction:(SEL)anAction 
{ 
    TargetActionPair * newSelf = [[self alloc] init]; 
    [newSelf setTarget:aTarget]; 
    [newSelf setAction:anAction]; 
    return [newSelf autorelease]; 
} 

- (void)fire 
{ 
    [target performSelector:action]; 
} 

@end 

जगह में उस वर्ग के साथ, अपने लक्ष्य/कार्रवाई जोड़े भंडारण बिल्कुल स्पष्ट:: यहाँ मैं इसे कैसे करना होगा है

MyCustomControl.h:

#import "TargetActionPair.h" 

@interface MyCustomControl : UIControl 
{ 
    NSMutableArray * touchUpEventHandlers; 
} 

- (id)init; 
- (void)dealloc; 

- (void)addHandlerForTouchUp:(TargetActionPair *)handler; 

@end 

MyCustomControl एमएम:

#import "TargetActionPair.h" 

@implementation MyCustomControl 

- (id)init 
{ 
    if ((self = [super init]) == nil) { return nil; } 
    touchUpEventHandlers = [[NSMutableArray alloc] initWithCapacity:0]; 
    return self; 
} 

- (void)dealloc 
{ 
    [touchUpEventHandlers release]; 
} 

- (void)addHandlerForTouchUp:(TargetActionPair *)handler 
{ 
    [touchUpEventHandlers addObject:handler]; 
} 

- (void) fireTargetsForTouchUpEvent 
{ 
    [touchUpEventHandlers makeObjectsPerformSelector:@selector(fire)]; 
} 

@end 
,210

उसके बाद, नियंत्रण स्थापित करने के रूप में निम्नानुसार किया जाएगा:

[instanceOfMyControl addHandlerForTouchUp: 
     [TargetActionPair pairWithTarget:someController 
           andAction:@selector(touchUpEvent)]; 
+0

वाह, सबसे बड़ा जवाब जो मैंने कभी यहां प्राप्त किया है;) धन्यवाद! मेरे मामले में, मुझे लगा कि यूआईसींट्रोल मुझे पहले से ही मुझे पेश करने की पेशकश करता है। लेकिन जब विशेष कस्टम घटनाएं होती हैं जिन्हें संसाधित करने की आवश्यकता होती है, तो आपकी तकनीक उत्कृष्ट होती है! –

+0

दरअसल, कस्टम घटनाओं के लिए आप UIControlEventAplicationReserved बिट्स (16 उपलब्ध) का उपयोग करना चाहते हैं और कॉल - (शून्य) sendActionsForControlEvents: (UIControlEvents) controlEvents; – Felixyz

+0

यहां क्या गुम है एक लक्ष्य/कार्रवाई और शायद एक डुप्लिकेट चेक को हटाने का एक तरीका है। – pixelfreak

38

मैं सिर्फ यह स्पष्ट करना चाहता हूं कि @ फ़ेलिक्सज़ ने क्या कहा क्योंकि यह पहले मुझे स्पष्ट नहीं था।

यदि आप UIControl उपclassing हैं, भले ही आप एक कस्टम घटना होने जा रहे हैं, तो आपको अपने लक्ष्य/कार्यों का ट्रैक रखने की आवश्यकता नहीं है। कार्यक्षमता वहाँ पहले से ही है, तुम सब करने की ज़रूरत घटना को गति प्रदान करने के लिए अपने उपवर्ग में नीचे दिए गए कोड कहते हैं: कि अपने कस्टम UIControl को दर्शाता है दृश्य या दृश्य नियंत्रक में फिर

[self sendActionsForControlEvents:UIControlEventValueChanged];

, बस

करना

[customControl addTarget:self action:@selector(whatever) forControlEvents:UIControlEventValueChanged];

कस्टम घटना के लिए, बस अपने खुद के enum परिभाषित करते हैं (उदाहरण के लिए, UIControlEventValueChanged1 << 12 के बराबर है)। बस सुनिश्चित करें कि यह UIControlEventApplicationReserved

+0

यही वही था जो मुझे चाहिए, धन्यवाद –

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

  • कोई संबंधित समस्या नहीं^_^