2014-12-09 13 views
5

Ich habe eine UIViewController, die eine UITableView und eine UISegmentedControl mit 4 Segmenten enthält. Jedes Mal, wenn der Benutzer auf ein anderes Segment klickt, sollte sich der in der Tabellenansicht angezeigte Zellentyp ändern. Dazu habe ich den folgenden Code:UITableView lädt nicht ordnungsgemäß auf iOS 7.1

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    [self.tableView reloadData]; 
} 

Üblicherweise wird das dritte Segment füllt die Tabellenansicht mit der größten Anzahl von Zellen. Während ich also im dritten Segment zum unteren Ende der Tabelle scrolle und dann zu einem anderen Segment wechsel, erwarte ich, dass die Tabellenansicht ihre Zellen einfach neu lädt und an der gleichen Bildlaufposition bleibt. Was jedoch passiert, ist, dass die Header-Ansicht am unteren Bildschirmrand zu liegen scheint, als ob die Tabellenansicht bis an ihre Grenzen gescrollt wäre. Wenn ich dann anfange zu scrollen und wieder zu scrollen, werden die Dinge wieder normal, als würde der Tisch einfach nach unten gescrollt und die Zellen erscheinen.

Ich habe versucht, dieses Problem für eine Weile jetzt zu lösen, und die Beiträge, die ich bis jetzt gesehen habe, haben alle dasselbe vorgeschlagen. Sie sagten, dass, wenn die Animation in einem anderen Thread als dem Hauptthread behandelt wird, diese Art von Problemen unvermeidlich sei. Also habe ich versucht, unter dem Code wie ändern:

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
    }); 
} 

und:

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     [self.tableView reloadData]; 
    }]; 
} 

Keiner von ihnen arbeiteten. Ich versuchte auch, die Tischansicht programmatisch zu scrollen, nachdem ich BU neu geladen hatte, das auch nicht zu funktionieren schien.

Hat jemand andere Ideen, warum dies auftreten könnte? Ich sollte beachten, dass dieses Problem nur auf iOS 7.1 auftritt.

+0

Haben Sie versucht, nur eine Zelle anstelle der ganzen Tabelle mit reloadRowsAtIndexPaths neu zu laden: withRowAnimation :? –

Antwort

1

Wie ich es verstehe, bekommen Sie nur das Problem, wenn Sie vom segmentierten Kontrollindexfilter mit der größten Anzahl von Ergebnissen weggehen.

Wenn Sie nach dem erneuten Laden versucht haben, die Tabellenansicht programmgesteuert zu scrollen, haben Sie berechnet, wie der Indexpfad für die Zielergebnismenge für segmentiertes Steuerelement 1 oder 2 aussehen würde?

Beispiel:

Wenn wir von segmentedControlIndex 3 bis 1 bewegen, in dem 3 30 Datensätze hat und 1 hat 10 Datensätze:

[self.tableView reloadData] 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:10 inSection:0]; 
[self.tableView scrollToRowAtIndexPath:indexPath 
       atScrollPosition: UITableViewScrollPositionBottom 
         animated:YES]; 

Die oben vorausgesetzt, Sie 1 Schnitt haben.

Verwandte Themen