2012-11-01 13 views
17

Ein Problem mit ein paar Tabellenansichten in meiner App.UITableView contentSize

Das Problem tritt auf, wenn sich der Inhalt der Tabelle ändert (und daher der Inhalt der Tabellenansicht größer wird).

Aus irgendeinem Grund behält die contentSize des UITableView die gleiche Bedeutung Ich kann nicht scrollen, um den neuen Inhalt zu sehen.

Dies geschieht entweder, wenn eine bestimmte Zelle größer wird (nach einem [TableView ReloadData];) oder wenn ich neue Zellen (mit den Delegate-Methoden NSFetchedResultsController) hinzufügen.

Gibt es etwas, was ich tun muss, damit TableView seine contentSize nachjustiert?

bearbeiten Code zu erhalten, aber das ist nur vorformulierten NSFetchedResultsController Delegierten Code ...

- (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]; 
} 

Ich habe diese Art der Sache getan, bevor sie in iOS5 und nie ein Problem mit ihm hatte. Scheint das eine iOS6 Änderung?

:: EDIT ::

Das dumme daran ist, dass ich eine Reihe von anderen UITableViewControllers in der gleichen App haben und sie arbeiten alle in Ordnung. Ich kann neue Zellen hinzufügen, dynamisch große Zellen hinzufügen, die Größe von Zellen ändern usw., und die Tabellen scrollen alle ganz nach oben und unten durch den gesamten Inhalt.

Dieses Problem tritt jetzt bei einigen Tabellenansichten auf, die ich kürzlich hinzugefügt habe.

:: EDIT ::

OK, tun nur einige Debug. Als ich zum ersten Mal in die Tabelle gehen Sehen Sie die contentSize.height 594. ist

Wenn ich ein neues Element dann hinzufügen und in die gleichen Tableviewcontroller zurück die contentSize.height 749.

, kann ich jedoch nicht Blättern Sie, um die neu hinzugefügte Zelle am unteren Rand der Tabelle anzuzeigen. Es wird einfach nicht dort blättern. Es springt auf die alte contentSize Höhe.

+0

Wenn Sie die richtige Höhe für die Zellen in 'heightForRow bieten: atIndexPath:' es in Ordnung sein sollte. Aktualisieren Sie die Höhe, wenn die Zelle größer werden soll? –

+0

Ich brauchte nie die Inhaltsgröße beim Hinzufügen von Zellen ändern. Welche Methoden verwendest du? InsertRow? Kannst du etwas Code zeigen? –

+0

Ja, ich stelle die Höhe richtig ein, wenn die tatsächliche Zelle größer wird. Der untere Teil der Tabellenansicht scrollt jedoch nicht um den Betrag, um den die Zelle größer wurde. Wenn die Zelle 50 Punkte größer wird, kann ich nicht scrollen, um die unteren 50 Punkte der Zelle zu sehen. Auch die Tabelle, in der ich neue Zellen hinzufüge, alle Zellen haben die gleiche Größe, nur mehr von ihnen. (Wie ein Masterdetailmodell hat die Haupttabellenansicht eine + Schaltfläche, um einen Controller zu einem neuen Element zu bringen, das dann im Master angezeigt wird.) Die neue Zelle ist dort, aber die Bildlaufansicht springt, so dass ich sie nicht sehen kann. – Fogmeister

Antwort

1

Ich hatte das gleiche Problem mit einem benutzerdefinierten Ansichts-Controller mit zwei untergeordneten VCs, eine ist eine Tabellenansicht + abgerufenen Ergebnis-Controller.

Ich würde nach dem Hinzufügen von Inhalt von einem VC zu dem Punkt kommen und zurück zu meiner Tabelle gehen, dass ich nicht in der Lage wäre, zu neuem Inhalt unten zu scrollen.

Also in meinem TableView + abgerufenen Ergebnis-Controller justiere ich die Inhaltsgröße basierend auf der Anzahl der abgerufenen Objekte, die ich habe, unabhängig davon, woher sie kamen.

Worst-Case-Szenario ist, dass ich keinen Inhalt hinzugefügt habe, wenn die VC angezeigt wird, aber die Kosten sind minimal.

//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

hat nicht für mich gearbeitet. – Shailesh

20

Ich bin in das gleiche Problem gerannt und endete mit dieser Problemumgehung.Ich gründe die contentSize direkt nach [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

Ah schön, das funktioniert auch für mich. Ich frage mich, warum Apple keinen Delegate-Aufruf bereitstellt, wenn die Tabellenansicht neu geladen wurde. – scrrr

-2

Try this:

ich mit simular issue.In meiner Situation getroffen habe, ziehe ich eine Tableview, um eine benutzerdefinierte Ansicht-Controller, die durch ein präsentiert push segue.Wenn die in der Tabellenansicht angezeigte Datenmenge eine bestimmte Anzahl überschreitet, kann ich die Zelle unten in der Tabellenansicht nicht berühren.

Viele Möglichkeiten wurden ausprobiert: Setzen Sie die Rahmen-/Inhaltsgröße der Tabellenansicht, und keine funktioniert für mich. Schließlich finde ich die Ursache und löse sie auf einfache Weise (wenn auch nicht anmutig).

Zuerst die Ursache: Die von IB erstellte Tabellenansicht hat eine größere Breite als der übergeordnete Ansichtscontroller. Damit wird jede Zelle außerhalb der Sichtgrenze nicht berührt.

Also, die Lösung ist einfach: Gehen Sie zu StoryBoard, passen Sie die Breite der Tabellenansicht, so dass es kleiner als die Breite der übergeordneten Ansicht.Es scheint, wenn eine Tabelle von StoryBoard erstellt wird, können Sie nicht ändern Frame für Code. Das habe ich bis jetzt gefunden. Ich denke, es ist ein Bug von StoryBoard.

Ich hoffe, es ist nützlich für Sie.

0

Ich habe dynamische TableView mit 'UITableViewAutomaticDimension'. Etwas passiert und nach dem erneuten Laden und es ist Inhalt Größe entspricht seiner Rahmengröße. Nachdem ich die Inhaltsgröße manuell so eingestellt habe, dass sie die Tabellengröße erreicht, funktioniert alles. Ich hoffe das hilft.

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

Und das ist, nachdem ich table.reloadData getan()

Verwandte Themen