Что делать, если в UITableView нет многоразовой ячейки - PullRequest
1 голос
/ 02 февраля 2012

Может кто-нибудь сказать мне, как правильно управлять UITableView, если у меня большое количество ячеек?Интерфейс каждой ячейки зависит от разделов (каждая ячейка хранит различные элементы пользовательского интерфейса в своем представлении содержимого).Я не хочу использовать многократно используемые ячейки, поскольку они портятся с перекрытием.

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) {
     cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault nil] autorelease];

 } else {
    cell = nil;
    [cell release];
    cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault nil] autorelease];
 }

Ответы [ 3 ]

5 голосов
/ 02 февраля 2012

Нет, ваш код неверен.Прежде всего, он даже не будет компилироваться, потому что [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault nil] не является допустимым синтаксисом.Во-вторых, строка [cell release]; не имеет никакого эффекта (что хорошо, потому что если бы она имела, это было бы неправильно), но ее присутствие показывает, что вы еще не поняли концепций управления памятью (пока).

В-третьих, исамое главное, вы обязательно должны использовать повторное использование ячеек табличного представления, особенно если у вас большая таблица.Если у вас разные типы ячеек, просто используйте для них разные идентификаторы повторного использования, нет проблем.Затем табличное представление создаст несколько пулов повторного использования и всегда возвращает ячейку того типа, который вы запрашиваете в dequeueReusableCellWithIdentifier:.

4 голосов
/ 02 февраля 2012

Я использую многоразовые ячейки в своем приложении.Я использую следующий метод:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}


NSUInteger row = [indexPath row];

cell.textLabel.text = [yourArray objectAtIndex:row];

return cell;
}

Он отлично работает.

2 голосов
/ 02 февраля 2012

Без reuseIdentfier вы быстро исчерпаете память, а просмотр таблиц будет выполняться медленно.В этом методе вы должны изменить содержимое ячеек, например заголовки, изображения и т. Д., Но не представления.Поэтому создайте подклассы ячейки для каждого нужного вам раздела.Настройте их представления и настройте содержимое этого метода.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault 
                              reuseIdentifier:CellIdentifier] autorelease];

} else {
    cell.title = [_cellTitles objectAtIndex:indexPath.row];
    cell.image = [_cellImages objectAtIndex:indexPath.section];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...