2009-10-17 11 views
11

UITableViewCell के एक अनुकूलित उप-वर्ग को लिखते समय, मुझे लगता है कि परिणाम सादे-स्टाइल UITableView की आयताकार कोशिकाओं के लिए अच्छी तरह से काम करते हैं, लेकिन समूहीकृत स्टाइल वाली तालिका में गोलाकार कोशिकाओं के लिए बिल्कुल काम नहीं करते हैं।समूहित UITableView के लिए UITableViewCell को विश्वसनीय रूप से कैसे वर्गीकृत करें?

क्या समूहबद्ध शैली तालिकाओं के लिए काम करने वाली कोशिकाओं को आकर्षित करने के लिए UITableViewCell विश्वसनीय रूप से subclass करने का कोई तरीका है? (इंटरफेस बिल्डर का उपयोग किए बिना।)

उत्तर

-1

आपको क्या समस्या है? DrawRect में आपको एक रेक्ट दिया जाता है, और अपना कुल आकार पता है - बस उस स्थान के अनुरूप है। यदि आप लेआउट सबव्यूव्स का उपयोग कर रहे हैं, वही बात।

+2

समस्या UITableView में वर्गीकृत किया मोड (, पक्षों पृष्ठभूमि प्रकट करने के लिए है और यह भी शीर्ष के कोनों और एक अनुभाग के नीचे कोशिकाओं दौर) कोशिकाओं के कुछ हिस्सों को काट देता है है। – jbrennan

+0

हाँ, यह समस्या है। –

+1

कुछ और परीक्षणों के बाद, आप सही हैं कि तालिका दृश्य कक्ष drawRect में सही आकार में पारित नहीं होते हैं। एक वैकल्पिक दृष्टिकोण एक कस्टम पृष्ठभूमि सेट करने के लिए एक मानक UITableViewCell के लिए देखें, और वहां अपने सभी चित्रकारी करें। आपको एक सेल सही चौड़ाई मिलती है लेकिन आपको गोलाकार शीर्ष और निचले कोनों को सही ढंग से आकर्षित करना होता है। –

2

मैंने इस समस्या को भी देखा है। मेरा कामकाज सिर्फ मेरी टेबल कोशिकाओं को छोटा करना है (320 की बजाय 300 चौड़ाई)। यह एक अच्छा समाधान नहीं है, लेकिन यह अच्छी तरह से काम करता है।

मुझे विश्वास नहीं है कि आप "समूहबद्ध" मोड में व्यक्तिगत आधार पर तालिका दृश्य इन्सेट से छुटकारा पा सकते हैं। मुझसे गलती भी हो सकती है!

8

मुझे UITableViewCell सबक्लास के साथ बहुत सारी समस्याएं होती थीं, लेकिन फिर मैंने सबक्लासिंग बंद कर दी। contentView पर contentView की संपत्ति को सबव्यू जोड़ना प्रतीत होता है कि मैंने जो भी उदाहरण चलाया है, वैसे ही वही काम पूरा करता है, इसलिए मैं इसे अपने UITableViewController के अंदर करता हूं।

- (UITableViewCell *)tableView:(UITableView*)tableView 
     cellForRowAtIndexPath: (NSIndexPath*)indexPath 
{  
    static NSString* CellIdentifier = @"AccountDetailsCell"; 
    UILabel* mainLabel = nil; 
    UILabel* valueLabel = nil; 
    const CGFloat kAccountDetailFontSize = 14.0; 

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault 
             reuseIdentifier: CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0, 150.0, 44.0)] autorelease]; 
     mainLabel.tag = MAINLABEL_TAG; 
     mainLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize]; 
     mainLabel.textAlignment = UITextAlignmentLeft; 
     mainLabel.textColor = [UIColor darkGrayColor]; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
     mainLabel.backgroundColor = [UIColor clearColor]; 
     [cell.contentView addSubview: mainLabel]; 

     valueLabel = [[[UILabel alloc] initWithFrame: CGRectMake(150.0, 0.0, 150.0, 44.0)] autorelease]; 
     valueLabel.tag = VALUELABEL_TAG; 
     valueLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize]; 
     valueLabel.textAlignment = UITextAlignmentRight; 
     valueLabel.textColor = [UIColor darkTextColor]; 
     valueLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     valueLabel.backgroundColor = [UIColor clearColor]; 
     [cell.contentView addSubview: valueLabel]; 
    } 
    else 
    { 
     mainLabel = (UILabel*)[cell.contentView viewWithTag: MAINLABEL_TAG]; 
     valueLabel = (UILabel*)[cell.contentView viewWithTag: VALUELABEL_TAG]; 
    } 

    mainLabel.text = (NSString*)kCellTitles[indexPath.section][indexPath.row]; 
    valueLabel.text = [self tableView: tableView valueLabelTextForRowAtIndexPath: indexPath]; 

    return cell; 
} 
+0

मुझे लगता है कि यह दृष्टिकोण मेरी आवश्यकताओं के लिए पर्याप्त नहीं है।मेरे पास एक सेल है जिसमें एक बहु-पंक्ति शीर्षक और बहु-रेखा विवरण है और दो लेबलों में निहित पाठ के आधार पर स्वयं को स्वत: बना देता है। मैं चीजों का आकार बदल रहा हूं - (शून्य) लेआउट सबव्यूव्स और पहले [सुपर लेआउटसब्यूव्यूज़] को कॉल करना याद रखना, लेकिन ऐसा लगता है कि self.contentView अभी भी इस कॉल के बाद आकार बदल नहीं रहा है, और इस प्रकार कभी-कभी मेरी कोशिकाएं गलत ऊंचाई को समाप्त करती हैं। – Johnus

+0

इस तरह की विधि अच्छी है, लेकिन यदि आप लेबल के लिए छाया जैसी क्वार्ट्जकोर चीजों का उपयोग करना चाहते हैं, तो स्क्रॉलिंग धीमी हो जाएगी, और आपको सेल को स्वयं आकर्षित करना होगा। – Alexander

+0

मैं बाद में उप-वर्गों के साथ बहुत खुश हूं क्योंकि मैंने हाल ही में किए गए कई समस्याओं को सही एसडीके में सही किया है। मेरी वर्तमान विधि में 'configWithDataObject: (id) dataObject' विधि वाला उप-वर्ग शामिल है जिसे मैं अपने कस्टम कक्षों के लिए उप-वर्गीकृत करता हूं। मेरा व्यू कंट्रोलर स्वचालित रूप से सही सेल उपclass चुनता है और 'configWithDataObject:' को कॉल करता है। विकास तेजी से और आसान बनाता है (हालांकि यह स्थिर कोड में इसे करने से तकनीकी रूप से कम कुशल है)। – jessecurry

9

जवाब पहले [super layoutSubviews] अपने UITableViewCell उपवर्ग के layoutSubviews विधि अंदर बुला के रूप में सरल हो सकता है:

यहाँ एक उदाहरण एक शीर्षक और मूल्य नहीं है क्या है?

मेरा कोड यहां है।

सबसे पहले मैं UITextField बना सकते हैं और initWithStyle: विधि में contentView में जोड़ें:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     inputField = [[UITextField alloc] initWithFrame:CGRectZero]; 
     [self.contentView addSubview:inputField]; 
     inputField.borderStyle = UITextBorderStyleLine; 
     [inputField release]; 
    } 
    return self; 
} 

फिर layoutSubviews में, मैं इस मिल गया है:

-(void)layoutSubviews 
{ 
    inputField.frame = CGRectMake(5, 5, 100, 20); 
} 

कि कोड के साथ, पाठ फ़ील्ड स्क्रीन के बाईं ओर से 5px है, जो निश्चित रूप से, तालिका कक्ष के बाईं ओर 5px है, जब यह समूहबद्ध मोड में है। दूसरे शब्दों में, तालिका के बाहर सेल देखें। अच्छा नहीं।

इस कोड का प्रयोग करें और inputField सेल के अधिकार के लिए 5px रखा गया है, की तरह मैं चाहता हूँ यह हो:

-(void)layoutSubviews 
{ 
    [super layoutSubviews]; // the magic line 
    inputField.frame = CGRectMake(5, 5, 100, 20); 
} 

मैं पूरी तरह से हो सकता था, समस्या आप कर रहे थे गलत समझा हालांकि!

एरिक

+0

मुझे यह कैसे याद आ सकता है? !! जादू लाइन के लिए बहुत बहुत धन्यवाद! – nonamelive