Iphone - cellForRowAtIndexPath在向下和向上滚动时表现得很奇怪

时间:2011-04-21 10:23:45

标签: iphone uitableview scroll

我想在accessoryView上获得一个包含不同元素的TableView,具体取决于部分。一切正常,但当我向下滚动到第2部分然后再向上滚动到第0部分时,第0部分中的行有切换器。你能帮我找出我做错了什么吗?

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSDictionary *dictionary;
NSArray *array;
NSString *cellValue;
UISwitch *switchView;

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

switch (sectionIndex) {
    case 0:
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        break;
    case 1:
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        break;
    case 2:
        switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
        cell.accessoryView = switchView;
        [switchView setOn:NO animated:NO];
        [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
        [switchView release];
        break;
    default:
        break;
}

dictionary = [searchArray objectAtIndex:indexPath.section];
array = [dictionary objectForKey:@"advancedSearch"];
cellValue = [array objectAtIndex:indexPath.row];
cell.textLabel.text = cellValue;

return cell;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger sectionIndex = [indexPath section]; static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; NSDictionary *dictionary; NSArray *array; NSString *cellValue; UISwitch *switchView; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } switch (sectionIndex) { case 0: cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; break; case 1: cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; break; case 2: switchView = [[UISwitch alloc] initWithFrame:CGRectZero]; cell.accessoryView = switchView; [switchView setOn:NO animated:NO]; [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; [switchView release]; break; default: break; } dictionary = [searchArray objectAtIndex:indexPath.section]; array = [dictionary objectForKey:@"advancedSearch"]; cellValue = [array objectAtIndex:indexPath.row]; cell.textLabel.text = cellValue; return cell;

3 个答案:

答案 0 :(得分:0)

为不同的单元格使用不同的单元格标识符。 类似的东西:

NSString *CellIdentifier;
switch ([indexPath row]) {
   case 0: CellIdentifier = @"cell0";
           break;
   case 1: CellIdentifier = @"cell1";
           break;
   default: CellIdentifier = @"cell";
           break;
}

否则Xcode会认为您的所有单元格都具有相同的外观,并在您滚动时尝试重复使用它们。

答案 1 :(得分:0)

您正在将表格单元格出列(参见-[UITableView dequeueReusableCellWithIdentifier:]),这意味着您正在接收已分配的表格视图,并且可能预先填充了陈旧数据。在switch语句的case 0:case 1:中,您应添加以下行:

cell.accessoryView = nil;

答案 2 :(得分:0)

问题来自dequeueReusableCellWithIdentifier,您必须为不同的单元格使用不同的标识符,因为您重复使用它们。