2012-03-28 12 views
19

मेरे ऐप में मेरे पास एक कस्टम UITableViewCell सबक्लास है जो दबाए जाने पर एक पिकर पॉप अप करता है। अब से मैं इस कक्षा को PickerCell. के रूप में संदर्भित करूंगा, मैं उसी UITableView में पिकरसेल के कई उदाहरणों का उपयोग कर रहा हूं।उद्देश्य सी - कस्टम कॉलबैक विधि को कैसे कार्यान्वित करें लेकिन विशिष्ट पैरामीटर को लागू करें?

मैं नहीं चाहता कि सेल पिकर में एक पंक्ति के चयन का जवाब दे, क्योंकि यह एक अच्छा एमवीसी नहीं है। इसके बजाय मैं व्यू कंट्रोलर को सेल को कॉलबैक देना चाहता हूं जिसे पंक्ति के चयन पर बुलाया जाएगा।

सबसे स्पष्ट तरीका PickerCellDelegate जैसे प्रोटोकॉल बनाने का सबसे स्पष्ट तरीका है और दृश्य नियंत्रक प्रत्येक सेल पर स्वयं को पास कर देगा।

इस दृष्टिकोण के साथ मेरी समस्या के बाद से मैं कई PickerCells है, ViewController में प्रोटोकॉल के अपने कार्यान्वयन प्रत्येक कोशिका के बीच भेद करना होगा कि है:

-(void) pickerCell : (PickerCell *) sender 
     didSelectRow : (NSInteger) row 
     inComponent : (NSInteger) component 
{ 
    if (sender == X) 
    // Something 
    else if (sender == Y) 
    // Something else... 
    // etc... 
} 

और मैं इस कोडिंग शैली नफरत ...

इसके बजाय मुझे वास्तव में एक तंत्र पसंद आएगा जो व्यू कंट्रोलर को अपनी कॉलबैक देने की अनुमति देता है।

मैं पिकरसेल को "onRowSelectedSelector" स्वीकार करने की अनुमति दे सकता हूं, लेकिन फिर मैं यह कैसे सुनिश्चित करूं कि यह चयनकर्ता प्रारूप में है जो मैं चाहता हूं? (पैरामीटर की संख्या सबसे महत्वपूर्ण है)

इससे भी बेहतर, मैं चयन पर निष्पादित करने के लिए पिकर सेल को ब्लॉक ब्लॉक करना चाहता हूं, क्योंकि मुझे पता है कि ब्लॉक को विशिष्ट पैरामीटर के साथ परिभाषित किया जा सकता है। इसके अलावा "लक्ष्य" ऑब्जेक्ट को पास करने की कोई आवश्यकता नहीं है।

तो मैं ऐसा कैसे कर सकता हूं?

धन्यवाद!

उत्तर

33

यह कैसे ब्लॉक कॉलबैक

typedef void(^PickerCallback)(NSInteger row, NSInteger component); 

@interface PickerCell 

@property (nonatomic, copy) PickerCallback callback; 

@end 

@implementation PickerCell 

@synthesize callback; 

- (void)whatever { 
    // when you want to call the callback block 
    if (self.callback) { 
     self.callback(row, component); 
    } 
} 

@end 

का उपयोग करें और

PickerCell *cell = // create a picker cell 
cell.callback = ^(NSInteger row, NSInteger component) { 
    // inside callback 
}; 
+0

बहुत बढ़िया बनाया पिकर सेल के बाद कॉलबैक ब्लॉक आवंटित करने के लिए है! ठीक वही जो मेरे द्वारा खोजा जा रहा था! –

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