spy*_*art 15 iphone uitableview ios
我用自定义的UITableViewCell类中的setSelected:animated:发现了一个奇怪的行为.我发现如果单击表格中的单元格,会多次调用此函数.我想知道这是正常行为还是我的代码中的错误.
为了帮助调试,我在我的自定义UITableViewCell类实现中修改了setSelected:animated: function,如下所示:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state.
if (selected)
NSLog(@"Yes %X", &self);
else
NSLog(@"No %X", &self);
}
Run Code Online (Sandbox Code Playgroud)
如果我点击模拟器中的单元格,这是我在控制台中得到的:
2011-03-22 22:05:26.963 marketPulse[3294:207] Yes BFFFDDD0
2011-03-22 22:05:26.964 marketPulse[3294:207] Yes BFFFDE30
Run Code Online (Sandbox Code Playgroud)
你会认为我只会获得1个条目,因为我只点击了1个单元格.
如果我在那之后点击另一个单元格:
2011-03-22 22:07:11.014 marketPulse[3294:207] No BFFFD890
2011-03-22 22:07:11.016 marketPulse[3294:207] No BFFFDD00
2011-03-22 22:07:11.017 marketPulse[3294:207] Yes BFFFDDD0
2011-03-22 22:07:11.017 marketPulse[3294:207] Yes BFFFDE30
Run Code Online (Sandbox Code Playgroud)
如果我连续两次点击同一个单元格,我会得到2个以上是:
2011-03-22 22:08:41.067 marketPulse[3294:207] Yes BFFFDDD0
2011-03-22 22:08:41.068 marketPulse[3294:207] Yes BFFFDE30
2011-03-22 22:08:41.069 marketPulse[3294:207] Yes BFFFDE30
Run Code Online (Sandbox Code Playgroud)
本次我点击同一个小区,更多的是我会的,如果我点击后不同的小区,我会得到很多的不
我在NSLog之前放了一个断点,看着调试器,似乎所有重复的调用都是来自同一个对象.
这是我的tableView:cellForRowAtIndexPath:函数的一部分,这样你就可以看到我的单元格是如何被处理的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ContentCellIdentifier = @"newsTableCellContent";
UITableViewCell *cell;
//index of cell data in tableData
NSUInteger index = indexPath.row / 2;
...
//content of story
else if( [indexPath row] % 2 == 1 ) {
cell = [tableView dequeueReusableCellWithIdentifier:ContentCellIdentifier];
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle]
loadNibNamed:@"newsTableCells"
owner:nil options:nil];
for (id currentObject in topLevelObjects) {
if ( [currentObject isKindOfClass:[newsTableCellContent class]] ) {
cell = currentObject;
break;
}
}
}
((newsTableCellContent *)cell).content.text = [[tableData objectAtIndex:index] description];
}
return cell;
}
Run Code Online (Sandbox Code Playgroud)
一切正常,所以很难判断重复调用setSelected:animated:是有意还是无意.如果这是正常操作,我可以使用其他方法,但我想知道是否发生这种情况.
谢谢
Kal*_*lle 14
发生的事情只是UITableView跟踪表中选择的单元格.
由于在滚动大型表视图时会重复使用单元格,因此表视图必须将所选单元格的列表分开.不仅如此,但每当它重用一个单元格时,它必须设置其选定的属性,因为它可能使用selected了之前化身的旧的无效状态.
当您点击一个单元格时,会发生以下几种情况:取消选择先前选择的单元格(使用setSelected:).新单元格突出显示.它被去突出显示(至少如果您点击,而不是按住手指),并且setSelected:因为选择了新单元格而调用该方法.那是一个.
第二个调用是延迟执行调用,可能来自表视图尚不知道表的最终状态是什么的点.这个调用是_selectAllSelectedRows,顾名思义,在所有选定的行上调用'setSelected:animated:'.那是第二次通话.其原因很可能是由于表视图处于"转换"状态而解决潜在问题,但谁知道.
是否是一个错误是解释.重复调用的修复方法是:
if (self.selected == selected) return;
Run Code Online (Sandbox Code Playgroud)
在调用super之前(你不必调用super self.selected == selected).
当表格滚动时绝对应该调用它。单元格被重用,这意味着,如果您滚动不可见区域中的单元格将被重用并重新初始化,包括对 setSelected 的调用,这基本上是一个轻量级属性设置器。
如果您确实想查看发生了什么,请将 NSLog 添加到 tableView:cellForRowAtIndexPath: ,它将记录 indexPath 和返回的单元格。
整个日志应该可以让您很好地了解内部发生的情况以及原因。我想它会是这样的(点击 IndexPath 1:1)
给我 1:0 上的单元格(之前选择的单元格)。
取消选择 1:0
再次给我 1:0 的单元格(取消选择后更新)
取消选择 1:0(更新此单元格上的选定标志并触发动画)
给我 1:1 的单元格
选择 1:1
给我 1:1 的单元格再次(选择后更新)
选择 1:1(更新此单元格上的选定标志并触发动画)
再次单击选定的单元格仅略有不同 - 它不会触发取消选择,而是会触发另一次更新。
| 归档时间: |
|
| 查看次数: |
13559 次 |
| 最近记录: |