Медленная прокрутка в UITableView, содержащем элементы пользовательского интерфейса в каждой ячейке - PullRequest
1 голос
/ 07 октября 2011

У меня есть 3 сегментированных элемента управления в каждой ячейке таблицы на iPad. Ориентация всегда для приложения в альбомной ориентации, и количество ячеек меняется для каждого запуска приложения. Приложение работает нормально, если количество строк составляет менее 10, но где-то выше, глюки начинают появляться.

Для приложения, которое я создаю, у меня может быть до 70 строк ==>, что означает 210 UISegmentedControls, все они размещены в памяти одновременно.

Есть ли обходной путь? Есть ли способ, которым я могу использовать эти UISegmentedControls? Если да, как я могу сохранить состояние сегментированного элемента управления?

Иначе, кто-нибудь может предложить новое решение? (Каждый сегментированный элемент управления имеет элементы «A» и «B», и есть три сегментированных элемента управления, представляющих три различных параметра для каждого объекта, соответствующего каждой строке таблицы).

UPDATE:

Вот код:

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

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

    // Configure the cell...
    segmentedControl1 = (UISegmentedControl*)[array1 objectAtIndex:[indexPath row]];
    segmentedControl1.frame = CGRectMake(180, 15, 100, 30);
    [cell.contentView addSubview:segmentedControl1];

    segmentedControl2 = (UISegmentedControl*)[array2 objectAtIndex:[indexPath row]];
    segmentedControl2.frame = CGRectMake(450, 15, 100, 30);
    [cell.contentView addSubview:segmentedControl2];

    segmentedControl3 = (UISegmentedControl*)[array3 objectAtIndex:[indexPath row]];
    segmentedControl3.frame = CGRectMake(725, 15, 100, 30);
    [cell.contentView addSubview:segmentedControl3];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

Ответы [ 5 ]

1 голос
/ 27 октября 2011

Создать пользовательский подкласс UITableViewCell.У вас есть три свойства для ваших трех UISegmentedControl с и добавьте их в методе init:

@interfate MyCell : UITableViewCell
@property (nonatomic, retain, readonly) UISegmentedControl *control1;
@property (nonatomic, retain, readonly) UISegmentedControl *control2;
@property (nonatomic, retain, readonly) UISegmentedControl *control3;
@end

@implementation

@synthesize control1 = _control1;
@synthesize control2 = _control2;
@synthesize control3 = _control2;

- (id)init
{
if ((self = [super init]))
{
    _control1 = [[UISegmentedControl alloc] init...];
    _control1.frame = CGRectMake(...);
    [self addSubView:_control1];

    // repeat with control2 & control3
}
//...
@end

Тогда вместо хранения массивов UISegmentedControl вы можете иметь массивы NSNumber удерживая выбранный индекс.

Затем вы могли бы сделать что-то вроде:

cell.control1.selectedIndex = [[array1 objectAtIndex:indexPath.row] integerValue];

Вы также можете создавать пользовательские объекты для хранения этих данных и сохранять их в одном массиве.

1 голос
/ 07 октября 2011

Вы должны повторно использовать UITableViewCells , которые содержат три общих UISegmentedControls.Когда вызывается tableView: cellForRowAtIndexPath:, вы должны установить правильные значения для каждого сегментированного элемента управления - всегда.

Эти значения должны храниться «где-то еще», вне ячеек, скорее всего, в том же месте, где вы получилидругие данные для ячеек.

Обновление с черновым кодом, не должно компилироваться как есть:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellId = @"CellId";
static NSString *cellNib = @"Cell";

UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellId];
if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:cellNib owner:self options:nil];
    for (id nibItem in nib)
    {
        if ([nibItem isKindOfClass:[UITableViewCell class]])
        {
            cell = (UITableViewCell *)nibItem;
            break;
        }
    }
}

// Configure the cell, all values!
UISegmentedControl *seg = nil;
seg = (UISegmentedControl *)[cell viewWithTag:1];
seg.selectedSegmentIndex = 0

UISegmentedControl *seg = nil;
seg = (UISegmentedControl *)[cell viewWithTag:2];
seg.selectedSegmentIndex = 0

return cell;
}

Идея состоит в том, что вы создаете пользовательский Шаблон UITableViewCell в Интерфейсном Разработчике с 3 сегментированными Элементами управления.Дайте каждому элементу управления уникальный номер тега.Используйте тег id , чтобы получить доступ к каждому конкретному элементу управления и настроить ВСЕ ЗНАЧЕНИЯ - потому что вы повторно используете одни и те же ячейки и по умолчанию они будут содержать старые значения.

Кстати о невыборе ячеек... Ну, есть много способов сделать это, даже написал в блоге об этом " Как отключить выбор UITableCell ".Да, он старый и имеет неправильный заголовок, но должен работать.

Надеюсь, это поможет:)

0 голосов
/ 07 октября 2011

Я подозреваю, что ваша проблема не в сегментарных элементах управления. UITableView имеет встроенные методы, позволяющие загружать и перезагружать классы, когда они выходят за пределы экрана, поэтому все 210 элементов управления не должны одновременно находиться в памяти.

Я бы начал с проверки, чтобы убедиться, что вы используете dequeueReusableCellWithIdentifier: правильно (особенно если каждый UITableViewCell относится к одному классу). Может также проверить утечки памяти.

0 голосов
/ 07 октября 2011

Вы можете выделить сегментированные элементы управления в своей ячейке для строки по пути индекса при создании ячеек. Выделите их в ячейке для строки по пути индекса. Выделите и добавьте сегментированные элементы управления в условии (cell == nil).

Или

Вы можете повторно использовать 3 сегментированных элемента управления для всех ячеек. И держите массив для хранения измененных значений.

0 голосов
/ 07 октября 2011

Я никогда не видел, чтобы UITableView поддерживал «живую» жизнь более чем на одну или две ячейки сверх тех, которые видны на экране.Используете ли вы dequeueReusableCellWithIdentifier для переработки ваших ячеек?

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