2009-12-12 17 views
11

में एक अनुभाग पाद लेख दृश्य जोड़ने पर क्रैश यह पहली बार है जब मैं यहां एक प्रश्न पूछता हूं, लेकिन मुझे यह कहना है कि पिछले कुछ महीनों में यह साइट मेरे लिए जबरदस्त मदद रही है (iphone-dev- बुद्धिमान), और मैं इसके लिए धन्यवाद।UITableView: रिक्त अनुभाग

हालांकि, मुझे इस समस्या के लिए कोई समाधान नहीं मिला है: मेरे पास 2 अनुभागों के साथ एक UITableView है, और पहली बार ऐप लॉन्च होने पर कोई पंक्ति नहीं है। उपयोगकर्ता बाद में अनुभागों को भर सकता है जैसा वह चाहता है (सामग्री यहां प्रासंगिक नहीं है)। पंक्तियों से भरे जाने पर UITableView अच्छा दिखता है, लेकिन जब कोई नहीं होता है तो बहुत बदसूरत लग रहा है (2 हेडर अनुभाग एक साथ सफेद जगह के साथ अटक गए हैं)। यही कारण है कि जब कोई पंक्ति नहीं है, तो मैं एक अच्छा "कोई पंक्ति" दृश्य जोड़ना चाहता हूं।

मैं viewForFooterInSection प्रयोग किया है:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { 

if(section == 0) 
{ 
    if([firstSectionArray count] == 0) 
     return 44; 
    else 
     return 0; 
} 

return 0; 

} 

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{ 

    if(section == 0) 
    { 
     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(200, 10, 50, 44)]; 
     label.backgroundColor = [UIColor clearColor]; 
     label.textColor = [UIColor colorWithWhite:0.6 alpha:1.0]; 
     label.textAlignment = UITextAlignmentCenter; 
     label.lineBreakMode = UILineBreakModeWordWrap; 
     label.numberOfLines = 0; 
     label.text = @"No row"; 
     return [label autorelease]; 
    } 

    return nil; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 2; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if(section == 0) 
    { 
     return [firstSectionArray count]; 
    } 
    return [secondSectionArray count]; 
} 

यह महान काम करता है: पाद लेख दृश्य दिखाई देता है वह भी तब, खंड 0. में कोई पंक्ति है लेकिन मेरी ऐप्लिकेशन क्रैश जब मैं संपादन मोड में प्रवेश करने और खण्ड के अंतिम पंक्ति हटाएँ 0:

अभिकथन विफलता में - [UIViewAnimation initWithView: indexPath: endRect: endAlpha: startFraction: endFraction: वक्र: animateFromCurrentPosition: shouldDeleteAfterAnimation: संपादन:] समाप्त एप्लिकेशन न आया हुआ अपवाद के कारण 'NSInterna lInconsistencyException ', कारण:' सेल एनीमेशन रोक अंश अधिक होना चाहिए की तुलना में अंश शुरू '

यह जब वहाँ अनुभाग 0 में कई पंक्तियों हैं ऐसा नहीं होता है यह केवल तब होता है जब वहाँ केवल एक ही पंक्ति छोड़ दिया है।

यहाँ संपादन मोड के लिए कोड है:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    // If row is deleted, remove it from the list. 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Find the book at the deleted row, and remove from application delegate's array. 

     if(indexPath.section == 0) 
     { [firstSectionArray removeObjectAtIndex:indexPath.row]; } 
     else 
     { [secondSectionArray removeObjectAtIndex:indexPath.row]; } 

     // Animate the deletion from the table. 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
          withRowAnimation:UITableViewRowAnimationBottom]; 


     [tableView reloadData]; 

    } 
} 

किसी को भी किसी भी विचार क्यों यह हो रहा है है? धन्यवाद

उत्तर

9

ऐसा लगता है कि यह क्या हो रहा है कि आंतरिक रूप से ऐप्पल का UITableView कोड यह मान रहा है कि जब आप कोई पंक्ति हटाते हैं, तो आपके दृश्य का पहला भाग छोटा हो जाएगा। सेक्शन हेडर फूटर बनाकर अचानक अंतिम पंक्ति की क्षतिपूर्ति करने के लिए लंबा हो जाता है, आप इसे भ्रमित कर रहे हैं।

दो विचारों को आप की कोशिश करने के लिए:

1., वैकल्पिक अनुभाग पाद लेख एक पिक्सेल या दो तालिका सेल कि दूर जा रहा है की तुलना में छोटे बनाने ताकि एनीमेशन कोड एक पिक्सेल करने के लिए हो जाता है की कोशिश या एनीमेशन के दो

2. अपनी तालिका के केवल पंक्ति को हटाने के बजाय, जब वहाँ कोई "वास्तविक" डेटा पंक्तियों हैं तालिका अभी भी numberOfRowsInSection वापसी 1 है और एक नकली "कोई डेटा" सेल बनाने के बजाय "कोई डेटा" केस के लिए टेबल फ़ूटर का उपयोग करना।

यह उन मामलों में से एक है जहां आपको केवल यह स्वीकार करना होगा कि ऐप्पल ने आपके लिए अपने कार्यक्रम का आधा हिस्सा लिखा है और आपको अपने सह-लेखक द्वारा किए गए कुछ विकल्पों के अनुरूप होना है, चाहे आप उन्हें पसंद करते हों या नहीं।

+1

आप मेरे नायक हैं! "कोई डेटा" सेल 2 पिक्सल छोटे बनाना इसे सब काम करता है! आपको बहुत - बहुत धन्यवाद! (और एफवाईआई, मैंने पहले ही दूसरे समाधान के बारे में सोचा था लेकिन इसे काम नहीं कर सका) मुझे अभी भी थोड़ी सी समस्या है: तालिका 0 में कोई पंक्ति नहीं होने पर तालिकादृश्य की पृष्ठभूमि अब सफेद है जब मुझे यह बेहतर लगता है यह खाली कोशिकाओं से भरा था (यहां छवि देखें: http://yfrog.com/izuitableviewproblemp)। कोई टिप? फिर से धन्यवाद डेविड, आपने मेरा दिन बनाया! – nmondollot

+0

कोई शानदार विचार नहीं है, शायद एक अलग सवाल के लायक है। –

+0

ठीक है, मैंने यही किया है। धन्यवाद – nmondollot

5
  • मेकअप खाली अनुभाग
  • उपयोग तालिका प्रथम खंड में पाद लेख के बजाय इस खंड में हैडर
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    if (section != OTHER_SECTION_INDEX) { 
     return nil; 
    } 
    //your code here 
} 

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    if (section != OTHER_SECTION_INDEX) { 
     return 0; 
    } 
    //your code 
} 
+0

"OTHER_SECTION_INDEX" क्या होना चाहिए? – LightningStryk

+0

मेरा उदाहरण header_view पर footer_view का उपयोग करके बदल रहा है - इसलिए आपको header_view का उपयोग करने के लिए नीचे एक खाली अनुभाग जोड़ना होगा। इस मामले में OTHER_SECTION_INDEX == 0 और header_view अनुभाग 1 – comonitos

+0

में होगा मेरे लिए काम नहीं करता है। –

1

यह दोनों deleteRowsAtIndexPaths:withAnimation: और reloadData पर कॉल करने के लिए आवश्यक नहीं होना चाहिए tableView।

जो समस्या आप देख रहे हैं वह समस्या है जो मैं deleteRowsAtIndexPaths:withAnimation: पर कॉल में प्रकट होने वाली समस्या है, और इस प्रकार, यह आपके लिए कभी भी reloadData पर नहीं जा रहा है।

नई कोशिकाओं को बनाने, उन्हें प्रबंधित करने, उन सभी स्थानों से निपटने का एक आसान समाधान जहां एक अलग सेल का सामना करना पड़ता है, reloadSections:withAnimation: का उपयोग करना है जब 0 से 1 पंक्ति में जा रहे किसी सेक्शन से निपटने के लिए या 1 से 0 पंक्तियां।

अर्थात कोड के निम्नलिखित लाइनों को बदल दें: निम्नलिखित

 BOOL useReloadSection; 
     if (indexPath.section == 0) 
     { 
      [firstSectionArray removeObjectAtIndex:indexPath.row]; 
      useReloadSection = 0 == firstSectionArray.count; 
     } 
     else 
     { 
      [secondSectionArray removeObjectAtIndex:indexPath.row]; 
      useReloadSection = 0 == secondSectionArray.count; 
     } 

     if (useReloadSection) 
      [tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] 
        withRowAnimation:UITableViewRowAnimationBottom]; 
     else 
      [tableView deleteRowsAtIndexPaths:@[indexPath] 
          withRowAnimation:UITableViewRowAnimationBottom]; 
+0

धन्यवाद! बहुत बढ़िया जवाब! – FunkyKat

1

साथ

 if(indexPath.section == 0) 
     { [firstSectionArray removeObjectAtIndex:indexPath.row]; } 
     else 
     { [secondSectionArray removeObjectAtIndex:indexPath.row]; } 

     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationBottom]; 

मैं एक ही दुर्घटना सामना कर रहा था, लग रहा है जैसे कि यह एक bug in the OS है।

मेरा विशिष्ट उपयोग केस एक UITableView से ढहने योग्य/विस्तार योग्य वर्गों से संबंधित है। मुझे सेक्शन डिवाइडर की आवश्यकता है (यही वह है जो मैं सेक्शन फूटर का उपयोग कर रहा था) लेकिन पंक्ति डिवाइडर नहीं (केवल सेल विभाजक का उपयोग नहीं कर सकता)।

मैं अनुभाग फूटर की ऊंचाई समायोजित करके समस्या को हल करने में सक्षम नहीं था। लेकिन एक सेक्शन हेडर का उपयोग करने के लिए स्विच करने से चाल चल रही है, बग/क्रैश अब नहीं हो रहा है।

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    CGRect frame = (CGRect){0, 0, self.view.bounds.size.width, 1}; 
    UIView *view = [[UIView alloc] initWithFrame:frame]; 
    view.backgroundColor = [UIColor commentReplyBackground]; 

    return view; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    return 1.0f; 
} 
0

आप में से जो लोग अभी भी अनुभाग पाद लेख की जरूरत के लिए, आप भी UITableViewStyleGrouped को tableview शैली बदलने का प्रयास कर सकते हैं। ऐसा लगता है कि इस मुद्दे को बाईपास करना है। एक ही दृश्य उपस्थिति प्राप्त करने के लिए, आपको बस अपने सभी अन्य पाद लेख और शीर्षलेखों को CGFLOAT_MIN पर सेट करना होगा।

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