Добавление ячейки в UITableView с анимацией - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть UITableView. Я заполняю его из NSDictionary с массивами для каждого набора элементов в таблице: меток, нижних колонтитулов, верхних колонтитулов, UIViews и т. Д.

В разделе 0 я хочу, чтобы строка № 2 появлялась при включении переключателя в строке № 1.

Что я сделал, и это работает, в numberOfRowsInSection я добавил этот код:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

if (interruptor.isOn==NO && section==0) {
    return [[[infoTableContentArray objectAtIndex: section] objectForKey:kLabelKey] count]-1;
}else{

    return [[[infoTableContentArray objectAtIndex: section] objectForKey:kLabelKey] count]; 

}

}

и действие, связанное с коммутатором (прерывателем):

-(IBAction)accioInterruptor:(id)sender{

[infoAndSettingsTable reloadData];

}

поэтому, когда коммутатор переключается, таблица перезагружается, и ячейка появляется или исчезает. это на самом деле работает, но нет анимации, которая делает это, м-м-м ... ну, вы знаете.

Я попытался реализовать reloadRowsAtIndexPaths: withRowAnimation, добавив его в код, вызываемый переключателем:

-(IBAction)accioInterruptor:(id)sender{



[infoAndSettingsTable beginUpdates];
[infoAndSettingsTable reloadRowsAtIndexPaths:[[infoTableContentArray objectAtIndex: 0] objectForKey:kLabelKey] withRowAnimation:UITableViewRowAnimationBottom];
[infoAndSettingsTable endUpdates];

}

Но это не работает. Сбой на линии [infoAndSettingsTable заканчиваетсяUpdates];

Кстати, во всех случаях следующее:

[[infoTableContentArray objectAtIndex: 0]

- это массив, содержащий метки для этого раздела.

Я все делаю правильно или я полностью проваливаюсь?

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 04 марта 2013

простой способ сделать это ......

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

insertIndexPaths - это массив NSIndexPaths для вставки в вашу таблицу.

deleteIndexPaths - это массив NSIndexPaths, которые будут удалены из вашей таблицы.

Пример формата массива для путей индекса:

NSArray *insertIndexPaths = [[NSArray alloc] initWithObjects:
        [NSIndexPath indexPathForRow:0 inSection:0],
        [NSIndexPath indexPathForRow:1 inSection:0],
        [NSIndexPath indexPathForRow:2 inSection:0],
        nil];

получил от этот вопрос

2 голосов
/ 08 ноября 2011

аргумент reloadRowsAtIndexPaths: должен быть массивом NSIndexPath объектов, идентифицирующих строки, которые вы хотите перезагрузить, а не метками для этого раздела. Кроме того, похоже, что вы хотите перезагрузить раздел, поэтому я бы попробовал следующее:

-(IBAction)accioInterruptor:(id)sender {
    [self reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationBottom];
}
2 голосов
/ 08 ноября 2011

Почему бы вам просто не использовать UITableView insertRowsAtIndexPaths:withRowAnimation:? Он был создан именно для этой цели, ссылка на класс UITableView содержит точное описание и примеры использования.

Помимо того, что он чище, он также более производительный, так как вам не нужно перезагружать всю таблицу (хотя это действительно важно, если в ней много ячеек)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...