UITableview перезавантажує дані з анімацією


76

У мене є UITableViewякий заповнюється з масиву та випадаючий список.
Якщо я виберу будь-який рядок зі спадного списку, масив буде вставлений з новими значеннями, і табличний перегляд повинен бути перезавантажений.

Як анімувати представлення таблиць новим вмістом масиву?

Анімація, як я хочу показати рядок по одному. я спробував цей метод

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

Що за анімація? що у вас є, спробуйте це зробити?
CRDave

анімація, як я хочу показати рядок по одному. я спробував цей метод - (void) reloadRowsAtIndexPaths: (NSArray ) indexPaths withRowAnimation: (UITableViewRowAnimation) анімація {NSIndexPath rowToReload = [NSIndexPath indexPathForRow: [count count] inSection: 0]; NSArray * rowToReload = [NSArray arrayWithObjects: rowToReload, nil]; [tableDetails reloadRowsAtIndexPaths: rowsToReload withRowAnimation: UITableViewRowAnimationNone]; }
Naveen Pathiyil

1
поставте цей код у своє запитання, щоб хтось міг допомогти вам краще.
CRDave

Відповіді:


116

Щоб додати до правильної відповіді, якщо ви хочете перезавантажити всі розділи у своєму, UITableViewвам потрібно виконати наступне:

ObjC

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

Стрімкий

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

Це перезавантажить усе в поданні таблиці з анімацією. Як бос.


14
Припустимо, що кількість розділів не змінилася. Я забезпечив це за допомогою цього тесту, [self.tableView numberOfSections] == [self numberOfSectionsInTableView:self.tableView]інакше, якого я просто називаю[self.tableView reloadData]
Аксель Гілмін

Так, це ретельний спосіб вирішити це.
Тім Віндзор Браун

@AxelGuilmin ти так правий, інакше він падає!
Боб де Грааф,

Swift 3 - нехай діапазон = NSMakeRange (0, self.tableView.numberOfSections) нехай секції = NSIndexSet (indexesIn: range) self.tableView.reloadSections (розділи як IndexSet, з: .automatic)
Крістіан Кардосо

3
@TimWindsorBrown, як перезавантажити вигляд таблиці з новими даними "Інші дані з вихідного масиву"
Мохаммад Еліас Альхусайн,

66

Свіфт 5:

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

Стрімкий 3

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

Стрімкий 2

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

Я ходив із цим у Свіфті


2
це найкраще рішення, оскільки воно дозволяє перезавантажувати розділи з різною кількістю рядків до та після дзвінка
Енріко Купелліні

53

використовуйте цей метод,

[_tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];

7
Це працює неправильно, якщо у вас є більше однієї секції або кількість секцій змінюється під час перезавантаження
Олексій Ф

2
@AlexeyF, тоді ви б вставили їх усіх у цей NSIndexSet і викликали метод вище. Якщо ви не можете цього зробити, у вашому дизайні коду щось не так.
Патрік Бассут

Крім того, це не дає належного ефекту, якщо ви хочете зберегти заголовок розділу, але не рядки ..
Sumit Gera

22

Спочатку скажіть tableView очікувати оновлення за допомогою beginUpdates. Потім оновіть відповідні розділи (якщо ваш tableView має лише один розділ, тоді просто передайте нуль для номера розділу). Тут ви вказуєте анімацію - ви можете пограти з нею, щоб отримати бажаний ефект. Після цього ви телефонуєте endUpdatesна tableView. Typedef для UITableViewRowAnimation визначає:

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

Пограйте, щоб побачити, який з них вам потрібен. Навіть вибір UITableViewRowAnimationNoneможе часом мати приємний ефект. Код оновлення таблиці нижче:

    [self.tableView beginUpdates];
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];

20

В Swift 3 ви можете просто додати наступне extensionв UITableView:

extension UITableView {
    func reloadData(with animation: UITableView.RowAnimation) {
        reloadSections(IndexSet(integersIn: 0..<numberOfSections), with: animation)
    }
}

3
Це було приголомшливим рішенням моєї проблеми. Дякую, дружище!
Frizzo,

1
Чудове рішення. Для тих, хто використовує swift 4, UITableViewRowAnimation було перейменовано на UITableView.RowAnimation.
Адам Варе,

7

Ви можете використовувати reloadSections:withRowAnimation:функції. Перевірте посилання на клас UITableView .

Перевірте ці reloadData за допомогою анімації, яка вже відповіла на ваше запитання.


але куди я повинен покласти код? [tableDetails reloadSections: [NSIndexSet indexSetWithIndex: 0] withRowAnimation: UITableViewRowAnimationFade]?
Naveen Pathiyil

після вибору випадаючого списку ви можете зателефонувати одному методу і помістити цей код туди.
arthankamal

випадаюче в тому сенсі, що це uitableview, лише я викликаю рядок didselect у indexpath, а потім заповнюю масив новим вмістом, а потім викликаю [relaviewaddata].
Naveen Pathiyil

тоді зробіть це у своємуdidselectrow
arthankamal

3

Нижче наведений метод підтримується tableView для анімації:

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

Використання:

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

Доступні різні типи анімації:

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

Сподіваюся, це може допомогти!


3

Я спробував це і TableєAnimated з плавною анімацією

// Помістіть цей код там, де ви хочете перезавантажити вигляд таблиці

dispatch_async(dispatch_get_main_queue(), ^{
    [UIView transitionWithView:<"TableName"> 
                      duration:0.1f 
                       options:UIViewAnimationOptionTransitionFlipFromRight 
                    animations:^(void) {
                        [<"TableName"> reloadData];
                    } completion:NULL];        
});

Приголомшлива ідея вирішує численні проблеми (наприклад, потрібно уникати аварійного завершення видалення останнього рядка при використанні інших методів тощо). Підлий спосіб перетворити дані переходу-перезавантаження в плавне перезавантаження даних. Плюс 500!
Джефф

2

Спробуйте анімувати під час переходу Зміна подання під час перезавантаження UITableView

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.