2

最初のセクションの最初の行に UISwitch のみを表示する UITableView がありますが、何らかの理由でスイッチが 4 番目のセクションに表示されています。また、スイッチのオン/オフが切り替えられるたびに、新しい UISwitch が別のセルに表示されます。とても不思議な動きをしています。どんな助けでも大歓迎です。

コード:

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

    PrettyTableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        cell = [[PrettyTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
        cell.tableViewBackgroundColor = tableView.backgroundColor;
    }

    [cell prepareForTableView:tableView indexPath:indexPath];
    cell.cornerRadius = 10;

    if (indexPath.section == 0) {
        if (indexPath.row == 0) {
            cell.textLabel.text = @"Push Notifications";
            pushNotificationSwitch = [[UISwitch alloc] init];
            pushNotificationSwitch.on = pushSwitchState;
            cell.accessoryView = pushNotificationSwitch;
            [pushNotificationSwitch addTarget:self action:@selector(pushSwitch:) forControlEvents:UIControlEventValueChanged];
            cell.userInteractionEnabled = YES;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
    }

    if  (indexPath.section == 1) {
        if (indexPath.row == 0) {
            cell.textLabel.text = @"Department Based";
            if (departmentBased) {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
            }
            else {
                cell.accessoryType = UITableViewCellAccessoryNone;
            }
            cell.userInteractionEnabled = YES;
        }
        if (indexPath.row == 1) {
            cell.textLabel.text = @"Location Based (GPS)";
            if (locationBased) {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
            }
            else {
                cell.accessoryType = UITableViewCellAccessoryNone;
            }            cell.userInteractionEnabled = YES;
        }
    }

    if (departmentBased) {
        if (indexPath.section == 2) {
            if (indexPath.row == 0) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 1) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 2) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 3) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 4) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 5) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 6) {
                cell.textLabel.text = @"xxxxxx";
            }
        }
        if (indexPath.section == 3) {
            if (indexPath.row == 0) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 1) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 2) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 3) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 4) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 5) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 6) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 7) {
                cell.textLabel.text = @"xxxxxx";
            }
            if (indexPath.row == 8) {
                cell.textLabel.text = @"xxxxxx";
            }
        }
    }
    return cell;
}
4

1 に答える 1

1

iOS でのセルの再利用性の影響が発生しています。すべてのセルに同じセル識別子を使用しているため、スクロールすると、古いセルが使用可能になり、tableView.

cell.accessoryView直後に nilに設定してみてください:

if (cell == nil) {
    cell = [[PrettyTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    cell.tableViewBackgroundColor = tableView.backgroundColor;
}

cell.accessoryView = nil;

または、その最初の に別のセル識別子を選択し、indexPathキューから取り出すときにそれを考慮してください。

BOOL firstCell = indexPath.row == 0 && indexPath.section == 0;
NSString *CellIdentifier = firstCell ? @"CellWithSwitch" : @"Cell";

PrettyTableViewCell *cell = 
       [tableViewdequeueReusableCellWithIdentifier: CellIdentifier];

if (cell == nil) {
    cell = [[PrettyTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    cell.tableViewBackgroundColor = tableView.backgroundColor;
}
于 2013-02-17T05:41:25.403 に答える