UITableView странное поведение - PullRequest
1 голос
/ 04 июня 2011

Я программирую панель настроек с помощью UITableView, который выглядит следующим образом: enter image description here

Первый раздел состоит из простых строк, а второй раздел - из строк с переключателем UIS в качестве подпредставления.

Когда я переключаюсь в альбомную ориентацию и начинаю прокручивать, представление таблицы ведет себя странным образом: enter image description here

Это мой код:

- (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
if (indexPath.section == 0) {
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    if (indexPath.row == 0) {
        cell.textLabel.text = @"Help";
    }else if (indexPath.row == 1){
        cell.textLabel.text = @"About us";
    }
    else if(indexPath.row == 2){
        cell.textLabel.text = @"Send to a friend";
    }
}else if(indexPath.section == 1){
    cell.accessoryType = UITableViewCellAccessoryNone;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if (indexPath.row == 0) {
        cell.textLabel.adjustsFontSizeToFitWidth = NO;
        cell.textLabel.text = @"Show favs at launch";
        [cell addSubview:favoritesSwitch];
    }else if (indexPath.row == 1){
        cell.textLabel.text = @"Open with Safari";
        [cell addSubview:browserSwitch];
    }
    else if(indexPath.row == 2){
        cell.textLabel.text = @"Remember query";
        [cell addSubview:lastQuerySwitch];
    }
    else if(indexPath.row == 3){
        cell.textLabel.text = @"Automatic keyboard";
        [cell addSubview:keyboardSwitch];
    }
}

return cell;
}

Заранее спасибо:)

Ответы [ 3 ]

4 голосов
/ 06 июня 2011

вы должны сделать только следующее:

Перейдите к , используйте один и тот же CellIdentifier для всех ячеек (производительность! Если вы создадите новый идентификатор для каждой ячейки, он будет работать, но потреблять много памяти). Использование более одного идентификатора ячейки целесообразно только в том случае, если ваши ячейки принципиально отличаются, например, разные пользовательские UITableViewCell-Subclasses.

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

когда вы установите для accessoryView значение nil, вы можете продолжать использовать accessoryType для кнопок DetailDisclosure при повторном использовании ячеек!

1 голос
/ 04 июня 2011

Это может произойти, потому что вы используете один и тот же идентификатор ячейки для доступа к ячейке таблицы.

Попробуйте с

NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d_%d",indexPath.section,indexPath.row];

вместо.

static NSString *CellIdentifier = @"Cell";
0 голосов
/ 04 июня 2011

TableView перерабатывает ячейки, в которые вы добавили ваш browserSwitch, lastQuerySwitch и keyboardSwitch. Там нет точки, в которой они будут удалены из вида клетки. Добавьте следующие строки сразу после // настройки комментария к ячейке. Я думаю, что это будет сортировать.

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