Iphone UITableView配电盘指示器螺母
我有一个UITableView(在UIViewController上),它是通过navigationController推送的。在推送的同时,我选择要填充表的数组。推送的代码如下所示: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
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;