DetailTextLabel在UITableViewCell中不断变化

时间:2012-01-29 02:17:15

标签: objective-c ios uitableview

我已经设置了一个带有3个部分的UITableView,这些部分来自包含每个部分的键的3个NSArrays。我尝试设置一个switch语句来为每个单元格手动设置detailTextLabels和附件视图,但每次滚动表格视图时,单元格看起来都会自行更改。有没有更有效的方法呢?

这是我尝试使用的一种方法:

switch (indexPath.section) 
{
    // info
    case 0:{
        cell.textLabel.text = [infoKeysArray objectAtIndex:indexPath.row];
        if ([cell.textLabel.text isEqualToString:@"Duration"]) 
        {
            cell.detailTextLabel.text = [task stringForDuration];
        }
        if ([cell.textLabel.text isEqualToString:@"Elapsed"]) 
        {
            // elapsed time
        }
        if ([cell.textLabel.text isEqualToString:@"Today"]) 
        {
            UISwitch *todaySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
            [todaySwitch addTarget:self action:@selector(todaySwitchValueChanged:) forControlEvents:UIControlEventValueChanged];
            [todaySwitch setOn:task.isToday];
            cell.accessoryView = todaySwitch;
            [todaySwitch release];
        }
    }
        break;
    // actions
    case 1:{
        cell.textLabel.text = [actionsKeysArray objectAtIndex:indexPath.row];
        if ([cell.textLabel.text isEqualToString:@"Priority"]) 
        {
            // priority
            [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
        }
        if ([cell.textLabel.text isEqualToString:@"Finish Early"]) 
        {
            // finish early
        }
        if ([cell.textLabel.text isEqualToString:@"Set New Time"]) 
        {
            [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
        }
        if ([cell.textLabel.text isEqualToString:@"Repeating"]) 
        {
            UISwitch *repeatingSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
            [repeatingSwitch addTarget:self action:@selector(repeatingSwitchValueChanged:) forControlEvents:UIControlEventValueChanged];
            [repeatingSwitch setOn:task.isRepeating];
            cell.accessoryView = repeatingSwitch;
            [repeatingSwitch release];
            //cell.detailTextLabel.text = nil;
        }
    }
        break;
    // details
    case 2:{
        cell.textLabel.text = [detailsKeysArray objectAtIndex:indexPath.row];
        if ([cell.textLabel.text isEqualToString:@"Specifics"]) 
        {
            cell.detailTextLabel.text = task.specifics;
            [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
        }
        if ([cell.textLabel.text isEqualToString:@"Repeated"]) 
        {
            // times repeated
        }
    }
        break;
    default:
        break;
}

这是另一个:

// Info section
if ([indexPath section] == 0) 
{
    // duration
    cell.textLabel.text = [infoKeysArray objectAtIndex:indexPath.row];
    if (indexPath.row == 0) 
    {
        cell.detailTextLabel.text = [task stringForDuration];
    }
    // elapsed time
    if (indexPath.row == 1) 
    {
        //cell.detailTextLabel.text = [task stringForTotalElapsedTime];
    }
    // today status
    if (indexPath.row == 2) 
    {
        UISwitch *todaySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
        [todaySwitch addTarget:self action:@selector(todaySwitchValueChanged:) forControlEvents:UIControlEventValueChanged];
        [todaySwitch setOn:task.isToday];
        cell.accessoryView = todaySwitch;
        [todaySwitch release];

    }
}
// actions section
if ([indexPath section] == 1) 
{
    cell.textLabel.text = [actionsKeysArray objectAtIndex:indexPath.row];
    // priority
    if (indexPath.row == 0) 
    {
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
    // finish early
    if (indexPath.row == 1) 
    {
        //[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
    // set new time
    if (indexPath.row == 2) 
    {
        //cell.accessoryView = repeatingSwitch;
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
    // repeating
    if (indexPath.row == 3) 
    {
        UISwitch *repeatingSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
        [repeatingSwitch addTarget:self action:@selector(repeatingSwitchValueChanged:) forControlEvents:UIControlEventValueChanged];
        [repeatingSwitch setOn:task.isRepeating];
        cell.accessoryView = repeatingSwitch;
        [repeatingSwitch release];
        cell.detailTextLabel.text = nil;
    }
}
// details section
if ([indexPath section] == 2) 
{
    cell.textLabel.text = [detailsKeysArray objectAtIndex:indexPath.row];
    // specifics
    if (indexPath.row == 0) 
    {
        //cell.detailTextLabel.text = taskDetails.specifics;
        cell.detailTextLabel.text = task.specifics;
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
    // repeated
    if (indexPath.row == 1) 
    {
        [cell setAccessoryView:nil];
    }
}

这两次尝试均在cellForRowAtIndexPath

1 个答案:

答案 0 :(得分:0)

我最终自己解决了这个问题,完全归功于@Till的评论。似乎UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]的工作方式是重用已经存在的单元格,因此为了在表中使用多个单元格类型,必须使用不同的重用标识符。或者,因为我只有7或8个表格视图单元格,所以我只是将单元格附件视图设置为nil,以便我不想包含UISwitch的所有单元格,如下所示:

[cell setAccessoryType:UITableViewCellAccessoryNone];

switch ([indexPath section]) 
{
    case 0:
    {
        cell.textLabel.text = [infoKeysArray objectAtIndex:indexPath.row];
        switch (indexPath.row) {
            case 0:
            {
                cell.detailTextLabel.text = task.stringForDuration;
                [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
                cell.accessoryView = nil;
            }
                break;
            case 1:
            {
                cell.detailTextLabel.text = @"00:00";
                [cell setAccessoryType:UITableViewCellAccessoryNone];
                cell.accessoryView = nil;
            }
                break;
            case 2:
            {
                UISwitch *todaySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
                [todaySwitch addTarget:self action:@selector(todaySwitchValueChanged:) forControlEvents:UIControlEventValueChanged];
                [todaySwitch setOn:task.isToday];
                cell.accessoryView = todaySwitch;
                [todaySwitch release];
                [cell setAccessoryType:UITableViewCellAccessoryNone];
                cell.detailTextLabel.text = @"";
            }
                break;
            default:
                break;
        }
    }
        break;
    case 1:
    {
        cell.textLabel.text = [actionsKeysArray objectAtIndex:indexPath.row];
        switch (indexPath.row) {
            case 0:
            {
                cell.detailTextLabel.text = @"Low";
                [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
                cell.accessoryView = nil;
            }
                break;
            case 1:
            {
                cell.detailTextLabel.text = @"";
                [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
                cell.accessoryView = nil;
            }
                break;
            case 2:
            {
                UISwitch *repeatingSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
                [repeatingSwitch addTarget:self action:@selector(repeatingSwitchValueChanged:) forControlEvents:UIControlEventValueChanged];
                [repeatingSwitch setOn:task.isRepeating];
                cell.accessoryView = repeatingSwitch;
                [repeatingSwitch release];
                cell.detailTextLabel.text = @"";
                [cell setAccessoryType:UITableViewCellAccessoryNone];
            }
                break;
            default:
                break;
        }
    }
        break;
    case 2:
    {
        cell.textLabel.text = [detailsKeysArray objectAtIndex:indexPath.row];
        switch (indexPath.row) {
            case 0:
            {
                cell.detailTextLabel.text = task.specifics;
                [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
                cell.accessoryView = nil;
            }
                break;
            case 1:
            {
                cell.detailTextLabel.text = @"0";
                [cell setAccessoryType:UITableViewCellAccessoryNone];
                cell.accessoryView = nil;
            }
                break;
            default:
                break;
        }
        break;
    }
    default:
        break;
}

这样就省去了处理多个重用标识符的麻烦。