UITableViewCells переупорядочить, когда не отображается на экране - PullRequest
2 голосов
/ 13 января 2010

У меня есть проблема, и мне очень трудно найти решение, даже если бы я предположил, что у многих людей были похожие проблемы.Надеюсь, кто-нибудь может мне помочь.

Я создал экран настроек для своего приложения, используя UITableView.NSArray используется для настройки элементов управления, которые я намереваюсь отобразить.Массив выглядит следующим образом:

[self setControlArray:[NSArray arrayWithObjects:
                 [NSArray arrayWithObjects:
                  [NSDictionary dictionaryWithObjectsAndKeys:@"Username", @"text", nil], 
                  [NSDictionary dictionaryWithObjectsAndKeys:@"Password", @"text", nil], 
                  [NSDictionary dictionaryWithObjectsAndKeys:@"Server", @"text", nil], 
                  [NSDictionary dictionaryWithObjectsAndKeys:@"Port", @"text", nil], 
                  [NSDictionary dictionaryWithObjectsAndKeys:@"Use SSL", @"text", nil], 
                  nil],
                 nil]];

Для каждого элемента в массиве я создаю элемент управления следующим образом (в ViewDidLoad):

// TextField: USERNAME
username = [[UITextField alloc] initWithFrame:CGRectMake(99.0, 15.0, 190.0, 18.0)];
[self layoutTextField:username withFont:[UIFont systemFontOfSize:13.0] keyboardType:UIKeyboardTypeAlphabet placeholder:@"Username" clearsOnBeginEditing:NO];
[username setText:[Settings sipUser]];          

Наконец, каждый элемент управления добавляется вUITableView с использованием сообщения [tableView: cellForRowAtIndexPath]:

static NSString *CellIdentifier = @"Cell";

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

    NSString *label = [[[controlArray objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]] objectForKey:@"text"];
    [[cell textLabel] setText:label];

    // TextField: USERNAME
    if ([[[[controlArray objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]] objectForKey:@"text"] isEqual:@"Username"]) {
        [[cell contentView] addSubview:username];
}
return cell;

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

Ответы [ 2 ]

2 голосов
/ 13 января 2010

Ваша проблема в том, что вы используете [tableView dequeueReusableCellWithIdentifier:CellIdentifier], который может фактически вернуть ненулевую ячейку (например, с помощью одной из других кнопок), а затем вы просто вернете ее, создавая впечатление, что они переставляют (почти ) случайно.

Вы должны сделать в коде ветвь else и, если ячейка многократного использования в удаленной очереди не равна nil:

  • удалить все кнопки из ячейки
  • добавьте нужную кнопку
  • установить метку ячейки

и затем верните его.

0 голосов
/ 14 января 2010

Спасибо, приятель, твое предложение сработало для меня. Для всех, кому интересно, мое сообщение [tableView: cellForRowAtIndexPath:] теперь выглядит следующим образом:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    NSString *label = [[[controlArray objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]] objectForKey:@"text"];
    [[cell textLabel] setText:label];

    // TextField: USERNAME
    if ([[[[controlArray objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]] objectForKey:@"text"] isEqual:@"Username"]) {
        [[cell contentView] addSubview:username];
    }
} else {
    NSString *label = [[[controlArray objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]] objectForKey:@"text"];
    [[cell textLabel] setText:label];

    // TextField: USERNAME
    if ([[[[controlArray objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]] objectForKey:@"text"] isEqual:@"Username"]) {
        [username removeFromSuperview];
        [[cell contentView] addSubview:username];
    }
}  
return cell;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...