UITableview reloaddata mit Animation

75

Ich habe eine, UITableViewdie aus Array und eine Dropdown-Liste gefüllt ist.
Wenn ich eine Zeile der Dropdown-Liste auswähle, wird das Array mit neuen Werten eingefügt und die Tabellenansicht sollte neu geladen werden.

Wie animiere ich die Tabellenansicht mit neuen Array-Inhalten?

Animation wie ich die Reihe einzeln zeigen möchte. Ich habe diese Methode ausprobiert

- (void)reloadRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation { 
NSIndexPath rowToReload = [NSIndexPath indexPathForRow:[names count] inSection:0];
 NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil]; 
[tableDetails reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];
 }
Naveen Pathiyil
quelle
Welche Art von Animation? Was hast du versucht, dies zu tun?
CRDave
Animation wie ich die Reihe einzeln zeigen möchte. Ich habe versucht , diese Methode - (void) reloadRowsAtIndexPaths: (NSArray ) indexPaths withRowAnimation: (UITableViewRowAnimation) Animation {NSIndexPath rowToReload = [NSIndexPath indexPathForRow: [Namen zählen] insection: 0]; NSArray * rowsToReload = [NSArray arrayWithObjects: rowToReload, nil]; [tableDetails reloadRowsAtIndexPaths: rowsToReload withRowAnimation: UITableViewRowAnimationNone]; }
Naveen Pathiyil
1
Fügen Sie diesen Code in Ihre Frage ein, damit Ihnen jemand besser helfen kann.
CRDave

Antworten:

116

Um zur richtigen Antwort hinzuzufügen, müssen Sie Folgendes tun , wenn Sie alle Abschnitte in Ihrem neu laden möchten UITableView:

ObjC

NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:self.tableView]);
NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range];
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationAutomatic];

Schnell

let range = NSMakeRange(0, self.tableView.numberOfSections)  
let sections = NSIndexSet(indexesIn: range)               
self.tableView.reloadSections(sections as IndexSet, with: .automatic) 

Dadurch wird alles in der Tabellenansicht mit einer Animation neu geladen. Wie ein Chef.

Tim Windsor Brown
quelle
13
Dies setzt voraus, dass sich die Anzahl der Abschnitte nicht ändert. Ich habe es mit diesem Test gesichert, [self.tableView numberOfSections] == [self numberOfSectionsInTableView:self.tableView]sonst rufe ich einfach an[self.tableView reloadData]
Axel Guilmin
Ja, das ist eine gründliche Art, damit umzugehen.
Tim Windsor Brown
@ AxelGuilmin du hast so recht, es stürzt sonst ab!
Bob de Graaf
Swift 3 - let range = NSMakeRange (0, self.tableView.numberOfSections) let section = NSIndexSet (indexesIn: range) self.tableView.reloadSections (Abschnitte als IndexSet, mit: .automatic)
Cristian Cardoso
3
@ TimWindsorBrown, wie man Tabellenansicht mit neuen Daten
neu lädt
62

Swift 5:

UIView.transition(with: tableView, duration: 1.0, options: .transitionCrossDissolve, animations: {self.tableView.reloadData()}, completion: nil)

Swift 3

UIView.transition(with: myTableView, duration: 1.0, options: .transitionCrossDissolve, animations: {self.myTableView.reloadData()}, completion: nil)

Swift 2

UIView.transitionWithView(myTableView, duration: 1.0, options: .TransitionCrossDissolve, animations: {self.myTableView.reloadData()}, completion: nil)

Ich ging damit in Swift

Tom Howard
quelle
2
Dies ist die beste Lösung, da es ermöglicht, Abschnitte mit unterschiedlicher Anzahl von Zeilen vor und nach dem Aufruf neu zu laden
Enrico Cupellini
53

Verwenden Sie diese Methode,

[_tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
Macpandit
quelle
7
Es funktioniert nicht richtig, wenn Sie mehr als einen Abschnitt haben oder sich die Anzahl der Abschnitte während des Neuladens ändert
Alexey F
2
@AlexeyF dann würden Sie sie alle in dieses NSIndexSet einfügen und die obige Methode aufrufen. Wenn Sie dies nicht tun können, stimmt etwas mit Ihrem Code-Design nicht.
Patrick Bassut
Es gibt auch nicht den richtigen Effekt, wenn Sie die Abschnittsüberschrift behalten möchten, aber keine Zeilen.
Sumit Gera
22

Sie weisen die tableView zunächst an, Aktualisierungen mit zu erwarten beginUpdates. Aktualisieren Sie dann die relevanten Abschnitte (wenn Ihre tableView nur einen Abschnitt enthält, übergeben Sie einfach Null für die Abschnittsnummer). Hier legen Sie die Animation fest - Sie können damit herumspielen, um den gewünschten Effekt zu erzielen. Danach rufen Sie endUpdatesdie tableView auf. Das typedef für UITableViewRowAnimation gibt Folgendes an:

typedef enum {
   UITableViewRowAnimationFade,
   UITableViewRowAnimationRight,
   UITableViewRowAnimationLeft,
   UITableViewRowAnimationTop,
   UITableViewRowAnimationBottom,
   UITableViewRowAnimationNone,
   UITableViewRowAnimationMiddle,
   UITableViewRowAnimationAutomatic = 100
} UITableViewRowAnimation;

Spielen Sie herum, um zu sehen, welche Sie wollen. Sogar die Auswahl UITableViewRowAnimationNonekann manchmal einen schönen Effekt haben. Tabellenaktualisierungscode unten:

    [self.tableView beginUpdates];
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];
Jai Govindani
quelle
20

In Swift 3 können Sie einfach Folgendes hinzufügen extensionzu UITableView:

extension UITableView {
    func reloadData(with animation: UITableView.RowAnimation) {
        reloadSections(IndexSet(integersIn: 0..<numberOfSections), with: animation)
    }
}
Natanel
quelle
3
Dies war eine großartige Lösung für mein Problem. Danke, Alter!
Frizzo
1
Tolle Lösung. Für Benutzer von Swift 4 wurde UITableViewRowAnimation in UITableView.RowAnimation umbenannt.
Adam Ware
7

Sie können reloadSections:withRowAnimation:Funktionen verwenden. Überprüfen Sie die UITableView-Klassenreferenz .

Überprüfen Sie diese reloadData mit Animation, die Ihre Frage bereits beantwortet hat.

Arthankamal
quelle
aber wo muss ich den code setzen? [tableDetails reloadSections: [NSIndexSet indexSetWithIndex: 0] withRowAnimation: UITableViewRowAnimationFade]?
Naveen Pathiyil
Nachdem Sie Ihre Dropdown-Liste ausgewählt haben, können Sie eine Methode aufrufen und diesen Code dort einfügen.
Arthankamal
Dropdown in dem Sinne, dass es nur eine geeignete Ansicht ist. Ich rufe die Zeile didselect im Indexpfad auf. Dann fülle ich das Array mit neuem Inhalt und rufe dann die [tableview relaoaddata] auf.
Naveen Pathiyil
dann tun Sie dies in Ihremdidselectrow
arthankamal
3

Die folgende Methode wird von tableView für Animationen unterstützt:

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);

Verwendung :

//Reload tableView with animation
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationRight]; 

Verschiedene Arten von Animationen sind verfügbar:

typedef NS_ENUM(NSInteger, UITableViewRowAnimation) {
UITableViewRowAnimationFade,
UITableViewRowAnimationRight,           // slide in from right (or out to right)
UITableViewRowAnimationLeft,
UITableViewRowAnimationTop,
UITableViewRowAnimationBottom,
UITableViewRowAnimationNone,            // available in iOS 3.0
UITableViewRowAnimationMiddle,          // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy
UITableViewRowAnimationAutomatic = 100  // available in iOS 5.0.  chooses an appropriate animation style for you    };

Hoffe das könnte helfen!

Jayprakash Dubey
quelle
3

Ich habe es versucht und meine Tableist Animatedmit flüssiger Animation

// Platzieren Sie diesen Code dort, wo Sie Ihre Tabellenansicht neu laden möchten

dispatch_async(dispatch_get_main_queue(), ^{
    [UIView transitionWithView:<"TableName"> 
                      duration:0.1f 
                       options:UIViewAnimationOptionTransitionFlipFromRight 
                    animations:^(void) {
                        [<"TableName"> reloadData];
                    } completion:NULL];        
});
Priyank Jotangiya
quelle
Tolle Idee, löst zahlreiche Probleme (z. B. muss vermieden werden, dass ein Absturz in der letzten Zeile gelöscht wird, wenn andere Methoden verwendet werden usw.). Eine hinterhältige Möglichkeit, aus einem Jump-ReloadData einen reibungslosen ReloadData zu machen. Plus 500!
Jeff
2

Versuchen Sie, während des Übergangs zu animieren. Ändern Sie eine Ansicht, während Sie UITableView neu laden

[UIView transitionWithView:_yourTableView 
                  duration:0.40f 
                   options:UIViewAnimationOptionTransitionCrossDissolve 
                animations:^(void) {[_yourTableView reloadData];}  
                completion:nil];
Mithun Ravindran
quelle
0

Swift 5:

let section = 0
tableView.reloadSections([section], with: .automatic)
え る ま る
quelle