2012-11-01 22 views
17

मेरे ऐप में कुछ तालिका दृश्यों के साथ समस्या होने पर।UITableView सामग्री आकार

समस्या तब होती है जब तालिका की सामग्री बदलती है (और इसलिए तालिकादृश्य की सामग्री बड़ी हो जाती है)।

किसी कारण से सामग्री UITableView का आकार एक ही अर्थ रहता है, मैं नई सामग्री देखने के लिए स्क्रॉल नहीं कर सकता।

यह तब होता है जब कोई विशेष सेल बड़ा हो जाता है (एक [tableView reloadData] के बाद;) या जब मैं नई कक्ष जोड़ता हूं (NSFetchedResultsController प्रतिनिधि विधियों का उपयोग करके)।

क्या टेबल के लिए मुझे कुछ करने की ज़रूरत है अपनी सामग्री को समायोजित करने के लिए दृश्य बदलें? कोड दिखाने

संपादित करने के लिए, लेकिन यह सिर्फ बॉयलरप्लेट NSFetchedResultsController प्रतिनिधि कोड है ...

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates. 
    [self.tableView beginUpdates]; 
} 


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 

    UITableView *tableView = self.tableView; 

    switch(type) { 

     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
      [self configureCell:(OJFPunchListCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray 
              arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView insertRowsAtIndexPaths:[NSArray 
              arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { 

    switch(type) { 

     case NSFetchedResultsChangeInsert: 
      [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates. 
    [self.tableView endUpdates]; 
} 

मैं iOS5 में पहले बात इस तरह का किया है और इसके साथ एक समस्या कभी नहीं था। ऐसा लगता है कि यह संभावित रूप से एक आईओएस 6 परिवर्तन है?

:: संपादित ::

इस बारे में बेवकूफ बात यह है कि मैं एक ही अनुप्रयोग में अन्य UITableViewControllers की एक संख्या है और वे सब ठीक काम कर रहे हैं है। मैं नई कोशिकाओं को जोड़ सकता हूं, गतिशील रूप से आकार की कोशिकाओं को जोड़ सकता हूं, कोशिकाओं का आकार बदल सकता हूं, आदि ... और सभी तालिकाएं सभी सामग्री को ऊपर और नीचे ठीक से स्क्रॉल करती हैं।

यह समस्या अब हाल ही में जोड़े गए कुछ टेबलव्यू पर हो रही है।

:: संपादित ::

ठीक है, बस कुछ डिबगिंग कर। जब मैं पहली बार टेबल में जाने देखें contentSize.height 594

है जब मैं तो एक नया आइटम जोड़ सकते हैं और एक ही tableviewController में वापस जाने contentSize.height 749.

है हालांकि, मैं नहीं कर सकता तालिका दृश्य के नीचे नए जोड़े गए सेल को देखने के लिए स्क्रॉल करें। यह सिर्फ 'स्क्रॉल नहीं होगा'। यह पुरानी सामग्री आकार की ऊंचाई पर उछालता है।

+0

आप 'heightForRow में कोशिकाओं के लिए सही ऊंचाई प्रदान करते हैं है: atIndexPath:' यह ठीक होना चाहिए। क्या आप ऊंचाई को अपडेट कर रहे हैं जब सेल बड़ा हो जाना चाहिए? –

+0

कोशिकाओं को जोड़ने के दौरान मुझे सामग्री को संशोधित करने की आवश्यकता नहीं थी। आप किस तरीके का उपयोग करते हैं? InsertRow? क्या आप कुछ कोड दिखा सकते हैं? –

+0

हाँ, मैं ऊंचाई को ठीक से सेट कर रहा हूं क्योंकि वास्तविक सेल बड़ा हो जाता है। लेकिन तालिकादृश्य के नीचे सेल उस मात्रा से स्क्रॉल नहीं करता है जिस पर सेल बड़ा हो गया है। यानी अगर सेल 50 अंक बड़ा हो जाता है तो मैं सेल के नीचे 50 अंक देखने के लिए स्क्रॉल नहीं कर सकता। साथ ही, वह तालिका जहां मैं नई कोशिकाओं को जोड़ रहा हूं, सभी कोशिकाएं एक ही आकार के हैं, उनमें से अधिकतर। (एक मास्टर विवरण मॉडल की तरह, मास्टर टेबल व्यू में एक नया आइटम बनाने के लिए नियंत्रक को धक्का देने के लिए एक बटन होता है जिसे मास्टर में दिखाया जाता है) नया सेल वहां होता है लेकिन स्क्रॉल व्यू बाउंस होता है इसलिए मैं इसे नहीं देख सकता। – Fogmeister

उत्तर

1

मुझे दो बच्चे वीसी के साथ एक कस्टम व्यू कंट्रोलर का उपयोग करने में एक ही समस्या थी, एक टेबलव्यू + प्राप्त परिणाम नियंत्रक।

मैं एक वीसी से सामग्री जोड़ने के बाद और मेरी मेज पर वापस जाने के बाद बिंदु पर पहुंच जाऊंगा कि मैं नीचे नई सामग्री पर स्क्रॉल करने में सक्षम नहीं हूं।

तो मेरे टेबलव्यू + प्राप्त परिणाम नियंत्रक में मैं सामग्री के आकार को मेरे पास प्राप्त वस्तुओं की संख्या के आधार पर समायोजित करता हूं, भले ही वे कहां से आए थे।

सबसे खराब स्थिति यह है कि मैंने वीसी दिखाते समय कोई सामग्री नहीं जोड़ा, लेकिन लागत कम है।

//In my tableview + fetched results controller class 
-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 


    NSUInteger objCount = self.fetchedResultsController.fetchedObjects.count; 
    //My custom cell has a height of 50.0f, yours may not! 
    CGFloat tableHeight = objCount * 50.0f; 

    NSLog(@"%i objects, total height: %f",objCount,tableHeight); 

    [self.tableView setContentSize:CGSizeMake(self.tableView.contentSize.width, tableHeight)]; 

} 
+0

मेरे लिए काम नहीं किया। – Shailesh

20

मैं एक ही समस्या में चल रहा था और इस समाधान के साथ समाप्त हो गया।मैं सेट कर रहा हूं contentSize सही होने के बाद [self.tableView endUpdates];

[self.tableView endUpdates]; 

NSLog(@"%f", self.tableView.contentSize.height); 

self.tableView.contentSize = [self.tableView sizeThatFits:CGSizeMake(CGRectGetWidth(self.tableView.bounds), CGFLOAT_MAX)]; 

NSLog(@"%f", self.tableView.contentSize.height); 

[self.tableView setContentInset:UIEdgeInsetsMake(50, 0, -50, 0)]; 
+4

आह अच्छा, यह मेरे लिए भी काम करता है। मुझे आश्चर्य है कि क्यों ऐप्पल एक प्रतिनिधि कॉल प्रदान नहीं करता है जब टेबल-व्यू पुनः लोड हो गया है। – scrrr

-2

इस प्रयास करें:

मैं मेरी स्थिति issue.In simular के साथ मुलाकात की है, मैं एक कस्टम दृश्य नियंत्रक है, जो एक से प्रस्तुत किया जाता है के लिए एक tableview खींचें segue दबाएं। यदि तालिकादृश्य में दिखाए गए डेटा की मात्रा कुछ संख्या से अधिक है, तो मैं तालिकादृश्य के नीचे सेल को स्पर्श नहीं कर सकता।

कई तरीकों का प्रयास किया गया है: तालिका दृश्य के फ्रेम/सामग्री आकार को सेट करें, और मेरे लिए कोई भी काम नहीं करता है। अंततः, मुझे मूल कारण मिल जाता है और इसे सरल तरीके से हल किया जाता है (हालांकि कृपा से नहीं)।

सबसे पहले, मूल कारण: आईबी द्वारा बनाई गई तालिका दृश्य में उसके पैरेंट व्यू कंट्रोलर की चौड़ाई बड़ी है। इस प्रकार, किसी भी सेल को देखने के बाउंड को छुआ नहीं जाएगा।

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

आशा है कि यह आपके लिए उपयोगी होगा।

0

मेरे पास गतिशील तालिका है 'UITableViewAutomaticDimension' के साथ देखें। कुछ होता है और पुनः लोड करने के बाद और इसकी सामग्री का आकार इसके फ्रेम आकार के बराबर होता है। मैन्युअल रूप से सामग्री आकार को टेबल सीमा आकार के रूप में रखने के बाद, सब कुछ काम करता है। आशा है कि ये आपकी मदद करेगा।

table.beginUpdates() 
table.contentSize = CGSize(width: table.bounds.width, height: table.bounds.height) 
table.endUpdates() 

और इस के बाद मैं table.reloadData किया()