2011-11-09 19 views
9

मैं एक कस्टम प्रतिनिधि को मेरे कस्टम यूआईटीबल व्यूसेल में जोड़ने की कोशिश कर रहा हूं।एक कस्टम UITableViewCell (खराब पहुंच त्रुटि) में एक प्रतिनिधि जोड़ना

इस सेल पर मेरे पास एक बटन है जिसे ViewController में एक विधि को आग लगाने की आवश्यकता है जहां UITableView चालू है।

मैं कस्टम प्रतिनिधि जोड़ने के लिए सभी सामान्य कदम उठा रहा हूं लेकिन कुछ कारणों से जब मैं रनटाइम पर वीसी खोलता हूं तो ऐप क्रैश हो जाता है और मुझे खराब पहुंच त्रुटि देता है।

जब मैं सभी प्रतिनिधि कोड पर टिप्पणी करता हूं तो यह ठीक से काम करता है इसलिए मेरा अनुमान है कि मैं अपने प्रतिनिधि को जोड़ने का तरीका गलत हूं। जब मैं अपनी आईडी संपत्ति को असम्बद्ध छोड़ देता हूं तो यह दुर्घटनाग्रस्त लगता है।

मैं वीसी में प्रोटोकॉल को लागू करता हूं। मैंने सेलफोर एट इंडेक्सपैथ में सेल को प्रतिनिधि को असाइन किया था:। सभी प्रतिनिधि विधियां जगह पर हैं। मैं अन्य वर्गों में समान निर्माण का उपयोग कर रहा हूं लेकिन पहले कभी UITableViewCells के उप-वर्ग में नहीं।

कुछ कोड पोस्ट करने से पहले मैं जानना चाहूंगा कि किसी को इससे पहले इस बग का सामना करना पड़ा था या नहीं। यदि उसने और कैसे हल किया है या यदि UITableViewCell सबक्लास के लिए कस्टम प्रतिनिधि बनाना भी संभव है।


संपादित करें:

मेरे customCell.h

#import <UIKit/UIKit.h> 

@class MyTableViewCell; 

@protocol MyTableCellProtocoll <NSObject> 

-(void) didPressButton:(MyTableViewCell *)theCell; 

@end 

@interface MyTableViewCell : UITableViewCell 
{ 

    UIButton *myButton; 

    id<MyTableCellProtocoll> delegationListener; 

} 

@property (nonatomic,retain) UIButton *myButton; 

@property (nonatomic,assign) id<MyTableCellProtocoll> delegationListener; 

- (void) buttonAction; 

@end 

मीटर

#import "MyTableViewCell.h" 

@implementation MyTableViewCell 

@synthesize myButton; 
@synthesize delegationListener; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 

     self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     self.myButton.backgroundColor = [UIColor clearColor]; 
     self.myButton.frame = CGRectMake(5, 0, 10, 32); 
     self.myButton.titleLabel.adjustsFontSizeToFitWidth = YES; 
     [self.myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside]; 
     [self.contentView addSubview:self.myButton]; 
    } 
    return self; 
} 

- (void) buttonAction 
{ 
    NSLog(@"buttonpressed"); 
    [self.delegationListener didPressButton:self]; 
} 

@end 

MyVC ज में उचित रूप में प्रतिनिधि को लागू करता है

@interface MyVC : UIViewController <UITableViewDelegate, UITableViewDataSource, MyTableCellProtocoll> 

और यह भी मीटर

- (void)didPressButton:(MyTableViewCell *)theCell 
{ 
    NSLog(@"didPressButton"); 
} 

मैं cellForRowAtIndexPath में किसी प्रकार में MyTableCellProtocoll से एक delegatemethod उपयोग करता है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.delegationListener = self; 
    } 

    return cell; 
} 

इन सभी स्थानों मैं प्रतिनिधि के लिए उपयोग कर रहे हैं। मैं इसे क्या करना चाहता हूं वह बटंटिटल बदलें और उस सेल (संशोधित डुप्लिकेट) के बाद कुछ पंक्तियां डालें

आशा है कि यह चीजों को थोड़ा और साफ़ कर देगा।


EDIT2: बटन विधि शुरू में बुलाया जा रहा है नहीं है के रूप में टिप्पणी अनुभाग में metioned किया गया था। लॉगकोड के साथ संपादित कोड।


EDIT3: बटन के साथ गलत कुछ भी नहीं है। यह प्रतिनिधि संपत्ति है जो कहीं गड़बड़ है। ब्रेकपॉइंट्स और लॉग और टिप्पणी के साथ मैंने इसके बारे में सुनिश्चित किया।

कोड मेरे डेटा स्रोत सूची में अंतिम तत्व तक चलाया जा रहा है तो यह क्रैश हो जाता है। अब समस्या के करीब 1 कदम मुझे लगता है।


अंतिम संपादन: ठीक है, इसे प्रतिनिधियों और बटन और अन्य घटकों के सभी की तरह लगता है सब पर समस्या नहीं थे। यह ऊंचाई थी ForRowAtIndexPath: मुझे खराब कर रहा है। किसी भी तरह से आपके सभी समर्थन के लिए धन्यवाद!

+0

कोड के बिना टिप्पणी नहीं कर सकता। लेकिन हां, एक UITableViewCell एक UIViewController को प्रतिनिधि के रूप में उपयोग कर सकता है - आपकी समस्या प्रतिनिधियों के मानक गलत उपयोग की तरह लगती है। और ... निर्भरता के आधार पर प्रतिनिधिमंडल सबसे अच्छा समाधान नहीं हो सकता है। –

+0

कोई कारण नहीं है कि एक प्रतिनिधि प्रोटोकॉल और आईडी ivar को NSObject सबक्लास (जो UITableViewCell है) – jbat100

+0

@PaulLynch में बनाना असंभव क्यों होना चाहिए: मैंने अपने कुछ कोड के साथ प्रश्न संपादित किया। इन स्थानों में मेरे प्रतिनिधि कार्यों का उपयोग है। आशा करता हूँ की ये काम करेगा। –

उत्तर

4

यह प्रश्न हल हो गया है। समस्या प्रतिनिधि में नहीं थी और अन्य उत्तरों में बटन समस्याओं से संबंधित नहीं थी। समस्या ऊंचाई में एक सेल के उपयोग में झूठ बोल रही थी ForRowAtIndexpath: और एक बार पता लगाया गया आसानी से हल किया गया था।

मैं कृपया jrturton द्वारा सही दिशा की ओर इशारा किया गया था और इसके लिए मेरा धन्यवाद है।

+3

क्या आप समाधान साझा कर सकते हैं? –

1

पहली बार अपने इंटरफेस MyTableViewCell कहा जाता है पर, कार्यान्वयन - iPadCheckTableViewCell। मुझे लगता है कि दोनों का एक ही नाम होना चाहिए। इस तरह

और बनाएं बटन:

self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; // instead of self.myButton = [[UIButton alloc] init]; - it's a memory leak 
+0

आह हाँ, मेरे कोड में यह वही नाम है। यह सिर्फ एक टाइपो है। दुर्भाग्य से त्रुटि नहीं। मैंने उस ^^ –

4

मैंने सुना है कि संश्लेषित accessors init दौरान नहीं किया जाना चाहिए। सीधे ivars का उपयोग कर सभी सेटअप कोड करने की कोशिश करें:

myButton = [[UIButton alloc] init];   
myButton.backgroundColor = [UIColor clearColor];   
myButton.frame = CGRectMake(5, 0, 10, 32);   myButton.titleLabel.adjustsFontSizeToFitWidth = YES;   
[myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];   
[contentView addSubview:myButton]; 

आप के रूप में बेरिलियम ठीक ही पता चलता है [UIButton buttonWithType:UIButtonTypeCustom]; करने के लिए अपने बटन निर्माण को बदलते हैं, तो आप भी retain लिए इसकी आवश्यकता होगी।

+0

के लिए एक संपादन किया है, यह बटन नहीं है जो यहां गड़बड़ है। जब बटन पूरी तरह से टिप्पणी की जाती है तो यह मुझे अभी भी एक ही bad_access त्रुटि देता है। –

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