iphone - UITableViewCell 选择器 setSelected :animated: gets called many times?

标签 iphone ios uitableview

我在我的自定义 UITableViewCell 类中发现了 setSelected:animated: 的奇怪行为。我发现如果我点击表格中的一个单元格,这个函数会被多次调用。我想知道这是正常行为还是我的代码中的错误。

为了帮助调试,我修改了自定义 UITableViewCell 类实现中的 setSelected:animated: 函数:

- (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);

}

如果我在模拟器中点击一个单元格,控制台中会显示以下内容:

2011-03-22 22:05:26.963 marketPulse[3294:207] Yes BFFFDDD0
2011-03-22 22:05:26.964 marketPulse[3294:207] Yes BFFFDE30

您会认为我只会得到 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

如果我连续点击同一个单元格 2 次,我会得到超过 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

我点击同一个单元格的次数越多,我得到的就越多,如果之后我点击不同的单元格,我会得到很多

我在 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;
}

一切正常,所以很难判断重复调用 setSelected:animated: 是有意还是无意。如果这是正常操作,我可以用另一种方法来凑合,但我只想知道这是否会发生。

谢谢

最佳答案

发生的事情只是 UITableView 跟踪表格中选择了哪些单元格。

由于当您滚动浏览大型表格 View 时会重复使用单元格,因此表格 View 必须将所选单元格的列表分开。不仅如此,每当它重新使用一个单元格时,它都必须设置它的 selected 属性,因为它可能正在使用一个旧的、无效的 selected 状态,来自以前的化身。

当您点击一个单元格时,会发生几件事:取消选择之前选择的单元格(使用 setSelected:)。新单元格突出显示。它取消突出显示(至少如果您点击而不是按住手指),并且调用 setSelected: 方法,因为选择了新单元格。就是一个。

第二个调用是一个延迟的执行调用,可能是从 TableView 还不知道表的最终状态的地方开始的。此调用转到 _selectAllSelectedRows,顾名思义,它会在所有选定行上调用“setSelected:animated:”。那是第二个电话。这样做的原因很可能是为了解决由于 TableView 处于“转换”状态而导致的潜在问题,但谁知道呢。

它是否是错误有待解释。重复调用的修复方法是简单地执行以下操作:

if (self.selected == selected) return;

就在调用 super 之前(如果 self.selected == selected,则不必调用 super)。

关于iphone - UITableViewCell 选择器 setSelected :animated: gets called many times?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5401226/

相关文章:

ios - 在 iOS swift3 中并行处理视频录制和通话功能

iphone - 隐藏 map 注释而不删除它们

ios - 如何在 Swift 中添加半径为 2pt 的模糊?

ios - 如何删除 xCode 5 中的配置文件

ios - 带有导航 Controller 的 Xcode TableView Controller 不显示表格单元格,但正在处理单元格中的数据

iphone - 在 GameCenter 中共享配置数据

iphone - 制作音频捕获器和音频播放器ios

android - 应用程序未设置 : This app is still in development mode

ios - UITableView 内容大小不正确

ios - 将按钮添加到 UITableView 单元格