iOS:CellForRowAtIndexPath单元格正在混淆

iOS:CellForRowAtIndexPath单元格正在混淆,第1张

概述首先说我见过这些问题: iOS: UITableView mixes up data when scrolling too fast (custom) UITableViewCell’s mixing up after scrolling Items mixed up after scrolling in UITableView 第一个和最后一个看起来与我的问题非常相关,但是我相当确定每个部分都有 首先说我见过这些问题:

iOS: UITableView mixes up data when scrolling too fast

(custom) UITableViewCell’s mixing up after scrolling

Items mixed up after scrolling in UITableView

第一个和最后一个看起来与我的问题非常相关,但是我相当确定每个部分都有逻辑来确定单元格中应该出现什么(数据),但它们仍然混淆了.

以下是相关代码:

- (UItableVIEwCell *)tableVIEw:(UItableVIEw *)tableVIEw cellForRowAtIndexPath:(NSIndexPath *)indexPath{//Note: the if (cell == nil) thing is no longer required in iOS 6static Nsstring *CellIDentifIEr = @"Cell";UItableVIEwCell *cell = [tableVIEw dequeueReusableCellWithIDentifIEr:CellIDentifIEr];if (cell == nil){    cell = [[UItableVIEwCell alloc] initWithStyle:UItableVIEwCellStyleSubTitle reuseIDentifIEr:CellIDentifIEr];}if (closestRenter != nil){    NSLog(@"CLOSEST RENTER!");    [self setupCellsWithClosestRenterCell:cell atIndexPath:indexPath];}else{    NSLog(@"NO CLOSEST RENTER");    [self setupCellsWithNoClosestRenterCell:cell atIndexPath:indexPath];}if (indexPath.section == 0){    for (UIVIEw *vIEw in cell.contentVIEw.subvIEws)    {        NSLog(@"WHAT THE HECK");        [vIEw removeFromSupervIEw];    }}return cell;

}

相关信息:

1)ClosestRenter不是……它存在.所以else子句永远不应该执行……就是这样.

2)在代码中:

[self setupCellsWithClosestRenterCell:cell atIndexPath:indexPath];

有一个简单的:

if (indexPath.section == 0){    cell.textLabel.text = @"PLACE HolDER";}else{    // Populate the cell with data. (creates a vIEw (with controller etc) and loads it into the cell)}

3)任何时候都有2个部分.

问题是第0部分(第一部分)应该只有那个占位符字符串.第1部分应该包含我的自定义子视图(在单元格中,它会这样做).

第0节最初只有占位符字符串,但是一旦我向下滚动(并且该部分不再可见)并向上滚动(快速),它有时会在第1部分中有一个看似随机的单元格…那到底是什么?怎么样?我不愿意把细胞重用归咎于细胞再利用,但在这一点上我真的很傻,我不知道它是什么.

这里令人不安的部分是第0节中的单元格(那里只有一行)没有子视图.但是当我快速向上和向下滚动时,它会得到一个(显然是第1部分),然后我得到了“WHAT THE HECK”日志消息……

值得一提的是,使用for循环(具有heck消息的那个)确实解决了问题(因为它删除了不需要的子视图)但必须有更好的方法.现在感觉不对劲.

有任何想法吗?

(请随意将其标记为副本,但我相当确定此处还有其他内容).

谢谢.

解决方法 因此,经过一点点挫折,仔细分析后,我发现为什么细胞混淆了.

我对细胞重用(特别是标识符)的假设就是问题所在.

以前我这样做:

static Nsstring *CellIDentifIEr = @"Cell";UItableVIEwCell *cell = [tableVIEw dequeueReusableCellWithIDentifIEr:CellIDentifIEr];if (cell == nil){    cell = [[UItableVIEwCell alloc] initWithStyle:UItableVIEwCellStyleSubTitle reuseIDentifIEr:CellIDentifIEr];}

这是伟大的,但有一个关键问题.所有细胞在技术上都是相同的…在它们全部被分配(而不是零)后,系统无法确定哪个细胞可以重复使用,无论它是什么部分.

这意味着可以从队列中抓取任何单元格,无论它有什么,并且卡在任何地方(尽管我的检查确保第1部分的第1部分,第0部分(假租借者)留在那里) .

解决方案:

- (UItableVIEwCell *)tableVIEw:(UItableVIEw *)tableVIEw cellForRowAtIndexPath:(NSIndexPath *)indexPath{//Note: the if (cell == nil) thing is no longer required in iOS 6static Nsstring *CellIDentifIEr1 = @"Cell";static Nsstring *CellIDentifIEr2 = @"Cell2";UItableVIEwCell *cell;if (indexPath.section == 0){    if (cell == nil)    {        cell = [[UItableVIEwCell alloc] initWithStyle:UItableVIEwCellStyleSubTitle reuseIDentifIEr:CellIDentifIEr1];    }    else    {        cell = [tableVIEw dequeueReusableCellWithIDentifIEr:CellIDentifIEr1];    }}else{    if (cell == nil)    {        cell = [[UItableVIEwCell alloc] initWithStyle:UItableVIEwCellStyleSubTitle reuseIDentifIEr:CellIDentifIEr1];    }    else    {        cell = [tableVIEw dequeueReusableCellWithIDentifIEr:CellIDentifIEr2];    }}if (closestRenter != nil){    NSLog(@"CLOSEST RENTER!");    [self setupCellsWithClosestRenterCell:cell atIndexPath:indexPath];}else{    NSLog(@"NO CLOSEST RENTER");    [self setupCellsWithNoClosestRenterCell:cell atIndexPath:indexPath];}return cell;

}

如您所见,第0部分将获得自己的单元标识符.第1部分也是如此.结果是当一个单元格要出列时,它将检查indexPath当前所在的部分并获取正确的单元格.

呃,这么令人沮丧的问题,但现在一切都有道理:)

总结

以上是内存溢出为你收集整理的iOS:CellForRowAtIndexPath单元格正在混淆全部内容,希望文章能够帮你解决iOS:CellForRowAtIndexPath单元格正在混淆所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1068972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存