xCode 4.2 Назначение UIS-переключателя на одну строку одного раздела приводит к странным поведениям ... IOS - PullRequest
1 голос
/ 27 марта 2012

Я делаю страницу настроек и хочу, чтобы в первой строке первого раздела был UISwitch. Я добился этого, используя следующий код:

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

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

    if (indexPath.section == 0){
        [[cell textLabel] setText:[table1labels objectAtIndex:indexPath.row]];
        if (indexPath.row == 0 && indexPath.section == 0){
            UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
            cell.accessoryView = switchview;
        }else{
            [[cell detailTextLabel] setText:@"test"];
        }
    }else{
        [[cell textLabel] setText:[table2labels objectAtIndex:indexPath.row]];
        [[cell detailTextLabel] setText:@"test"];
    }

    return cell;
}

Когда страница загружается, первая строка в первом разделе имеет переключатель UIS, а все остальные говорят «тест». Однако, когда я прокручиваю страницу, другие UIS-переключатели появляются случайно. Они не заменяют текст «тест», а просто толкают его влево. Это не происходит на каждом из них. Просто случайно, когда ячейка покидает вид и возвращается в вид. Может кто-нибудь сказать мне, как это исправить?

Я тестировал только на симуляторе 5.1. Еще не на реальном устройстве. Может ли это быть проблемой симулятора?

1 Ответ

2 голосов
/ 27 марта 2012

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

Теперь предположим, что ячейка, которая первоначально использовалась для вашего UISwitch, повторно используется для индекса, который не равен индексу, в котором вы хотите ее отобразить. В этом случае вам придется вручную скрыть или заменить UISwitch.

В качестве альтернативы я настоятельно рекомендую вам использовать разные идентификаторы ячеек для ячеек, которые на самом деле не похожи друг на друга.

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier;
    if (indexPath.row == 0 && indexPath.section == 0)
    {
        cellIdentifier = @"CellWithSwitch";
    }
    else
    {
        cellIdentifier = @"PlainCell";
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
    }

    if (indexPath.section == 0)
    {
        [[cell textLabel] setText:[table1labels objectAtIndex:indexPath.row]];
        if (indexPath.row == 0 && indexPath.section == 0)
        {
            UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
            cell.accessoryView = switchview;
        }
        else
        {
            [[cell detailTextLabel] setText:@"test"];
        }
    }else{
        [[cell textLabel] setText:[table2labels objectAtIndex:indexPath.row]];
        [[cell detailTextLabel] setText:@"test"];
    }

    return cell;
}
...