Iphone UITableView配电盘指示器螺母

Iphone UITableView配电盘指示器螺母,iphone,ios,uitableview,uinavigationcontroller,Iphone,Ios,Uitableview,Uinavigationcontroller,我有一个UITableView(在UIViewController上),它是通过navigationController推送的。在推送的同时,我选择要填充表的数组。推送的代码如下所示: if(self.newView == nil) { NewView *viewTwo = [[NewView alloc] initWithNibName:@"Bundle" bundle:[NSBundle mainBundle]]; self.newView = viewTwo; [v

我有一个UITableView(在UIViewController上),它是通过navigationController推送的。在推送的同时,我选择要填充表的数组。推送的代码如下所示:

if(self.newView == nil)
{
    NewView *viewTwo = [[NewView alloc] initWithNibName:@"Bundle" bundle:[NSBundle mainBundle]];
    self.newView = viewTwo;
    [viewTwo release];
}

[self.navigationController pushViewController:self.newView animated:YES];
newView.tableArray=newView.arrayWithOptionOne;
[newView.tableView reloadData];
一切都很好,每次都会重新加载表。但是,在第0节的最后一行中,有一个开关加载第1节。 第1节的最后一行是可攻丝的(didSelect…),它加载一个modalView。在最后一根杆子上,我添加了一个揭露指示器,轻敲时还添加了蓝色背景。该表具有滑块、标签等,因此定制时间相当长:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

UITableViewCell *cell = nil;


static NSString *kDisplayCell_ID = @"DisplayCellID";

cell = [tableView dequeueReusableCellWithIdentifier:kDisplayCell_ID];

if (cell == nil)
    {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:kDisplayCell_ID] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }
else
    {

    UIView *viewToRemove = nil;
    viewToRemove = [cell.contentView viewWithTag:1];
    if (viewToRemove)
        [viewToRemove removeFromSuperview];

    UIView *viewToRemove2 = nil;
    viewToRemove2 = [cell.contentView viewWithTag:2];
    if (viewToRemove2)
        [viewToRemove2 removeFromSuperview];


 }


    if (indexPath.section==0) {
        UIControl *cellValueS = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewKey] objectAtIndex:indexPath.row];
        [cell.contentView addSubview:cellValueS];
    }

    if (indexPath.section==0 && indexPath.row==3) {
        UIControl *cellValueL = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewLabel] objectAtIndex:0] ;
        [cell.contentView addSubview:cellValueL];
    }

    if (indexPath.section==1 && indexPath.row==0){
        UIControl *cellValueS = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewKey] objectAtIndex:indexPath.row] ;
        [cell.contentView addSubview:cellValueS];
    } 

    if (indexPath.section==1 && indexPath.row==1) {
        UIControl *cellValueS = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewKey] objectAtIndex:indexPath.row] ;
        [cell.contentView addSubview:cellValueS];

        UIControl *cellValueL = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewLabel] objectAtIndex:0] ;
        [cell.contentView addSubview:cellValueL];
    }

    if (indexPath.section==1 && indexPath.row==2) {
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
        cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    }

    return cell;
}
到目前为止还可以

问题是,当我返回到上一个视图并选择另一个选项来填充表时,当再次推送表时,我会在同一部分的其他行上看到披露指示符和蓝色选择背景。我观察到这取决于表格的滚动位置

我试着去理解为什么会这样,但我不能。我通过将newView设置为nil并释放它,然后在再次推送之前再次分配它,以某种方式解决了这个问题

我做错什么了吗?或者为什么披露指标和背景出现在不应该出现的地方

提前谢谢

开关的动作

-(void)extraOptionsSwitchAction:(id)sender{



 switch(extraOptionsSwitch.isOn) {

 case 1:

 // [self.tableView beginUpdates];
 [self.tableView insertSections: [NSIndexSet indexSetWithIndex:1]  withRowAnimation:UITableViewRowAnimationAutomatic];
 [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

 //[self.tableView reloadData];
 //  [self.tableView endUpdates];

 break;

 case !1:

 //   [self.tableView beginUpdates];
 [self.tableView deleteSections: [NSIndexSet indexSetWithIndex:1]  withRowAnimation:UITableViewRowAnimationAutomatic];
 // [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

 [self.tableView reloadData];
 // [self.tableView endUpdates];

 break;

 }
 }

这是由于
cellReusability
,而且它在很长一段时间内浪费了许多开发人员的时间和精力。如果您知道单元可重用性的概念,您就会知道,在滚动时,行和节的索引保持不变(尽管您希望在
uiTableView
上的不同位置的索引会有所不同)


唯一的方法是
UITableViewCell
进行子类化,创建自己的
CustomUITableViewCell
,并使用公开指示符来实现,或者将您的输入限制在一个适合屏幕的小表视图上,并使
可滚动=否
必须使用重复使用单元格。在单元格创建方法中,您可能无法区分不同的单元格类型,因此屏幕外的一个单元格可以很容易地重新用于另一个(不同类型)单元格。此外,您似乎一次又一次地添加子视图——只在实例化单元(使用alloc/int)时才这样做,而在配置时不这样做

另外,对于不同的单元格类型,使用不同的标识符(您没有显示此代码)

编程指南中有关于表视图及其单元格和重用模式的好例子。这本书值得读几遍——很容易出错,也是性能调优的一个主要主题

编辑

现在您添加了更多代码,另一个问题似乎出现在这里:

if (indexPath.section==1 && indexPath.row==2) {
    cell.selectionStyle = UITableViewCellSelectionStyleBlue;
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
}
您缺少一个
else
部分。
selectionStyle
accessoryType
设置为之前的设置-您无法为除特殊单元格之外的所有其他单元格正确配置单元格

不过,每种单元格类型都应该有自己的标识符。如果添加/删除子视图按预期工作,则很难从该代码中分辨出来

一个想法是:由于您实际上并没有重用这里的很多单元格,所以您甚至可以通过更改来禁用重用

static NSString *kDisplayCell_ID = @"DisplayCellID";
cell = [tableView dequeueReusableCellWithIdentifier:kDisplayCell_ID];


这总是会产生一个新的细胞。不过,在一般情况下,我不建议这样做。

+1-一般来说,所有的编程指南都写得很好,值得一读。@Eiko我为该方法添加了全部代码。我实际上使用了苹果自己的示例代码作为参考。如果我必须在一个单元格上添加两个不同的子视图,我会注意它们具有不同的标记,以便它们在离开屏幕时都被释放。此外,我添加的子视图没有任何问题,它只是磁盘指示器和点击背景。如果我添加了一堆子视图,那是因为在一行中有一个带标签的滑块指示其值,在下一行中我只需要一个文本字段,等等。现在我再次检查了它,它与滚动无关。这似乎与推送视图时加载的数组有关。当我回去再按一下arrayOne或ArrayTree时,我看到第二排和第三排的圆盘。如果我推数组2,我会在三行上看到disclosures指示符。这些数组包含两个nsdictionary,一个用于Section==0,一个用于Section==1。有趣的是,section==1对它们来说都是一样的。我相信我知道问题在哪里。当我启动汽车发动机去工作时,我突然想起了这件事。我讨厌那样。我认为,带有披露指标和背景的有条件声明应该在单元格的分配下,在该单元格中声明其他单元格行为。现在我要等10多个小时才能知道我是否正确。讨厌它@Eiko我知道代码不是很清楚,但是子视图工作得很好。即使它能工作,我还是想把它改写得更清楚,以便我将来参考。因此,如果我正确理解了你的答案,那么今天早上的想法是正确的。不是吗?。你能详细解释一下“一个单元格一个标识符”是什么意思吗?
static NSString *kDisplayCell_ID = nil;