gpt4 book ai didi

ios - UITableViewCell 在滚动时在某些单元格和不同的单元格中显示 UIImageView - 与 CoreData 和 NSFetchedResultsController 一起使用

转载 作者:行者123 更新时间:2023-12-01 19:00:14 25 4
gpt4 key购买 nike

我有一个简单的应用程序,其中 UITableView由用户点击 UINavigationBar 中的项目然后被带到另一个 View 以填写 UITextFields 填充和 UITextView .当用户点击保存时,信息保存到Core Data然后在此 UITableView 中表示使用 NSFetchedResultsController .

其中一个属性是“交易”实体上的“备注”属性。填写UITextView中的备注是完全可选的,但是如果用户添加了注释,我想显示我在单元格上为包含注释的条目创建的自定义图像。

当应用程序仅在此版本中运行时(因此已删除并与此开发人员版本一起安装),它运行良好,并且单元格仅显示具有注释的单元格的注释。但是,当从应用程序的先前版本更新时,就会出现问题。

该应用程序的先前版本没有 Notes 属性,因此我使用 CoreData 轻量级迁移来设置具有 Notes 属性的新模型。那部分有效。

问题

由于单元格的重复使用,我注意到当我从旧版本更新到这个新版本时,没有一个单元格具有自定义图像,这很好,因为注释不存在。但是,如果我进入并添加一个带有注释的新条目,然后滚动浏览我的 UITableView ,我注意到单元格开始随机显示自定义图像,基于滚动。所以它从一个单元格中消失并出现在另一个单元格中。这对我的用户来说是一个很大的错误陈述,我不太确定如何解决这个问题。

在我的 cellForRow我有以下代码:

self.pin = [[UIImageView alloc] initWithFrame:CGRectMake(13, 30, 24, 25)];
self.pin.image = [UIImage imageNamed:@"pin"];
self.pin.tag = 777;
if (!transaction.notes) {
dispatch_async (dispatch_get_main_queue (), ^{
[[customCell viewWithTag:777] removeFromSuperview];
});
}


if ([transaction.notes isEqualToString:@""] || ([transaction.notes isEqualToString:@" "] || ([transaction.notes isEqualToString:@" "] || ([transaction.notes isEqualToString:@" "]))))
{
[[customCell viewWithTag:777] removeFromSuperview];
}
else
{
[customCell addSubview:self.pin];
}

因此,第一个 if 语句是检查注释是否存在,并且在从旧版本的应用程序更新到此版本时返回 true。第二个 if 语句只检查注释的值是否等于几个空格,如果是,则删除注释。

我只是无法弄清楚这里发生了什么。

可能的解决方案

在同一个 UITableView单元格,我也有一个绿点/红点 UIImageView这取决于用户在添加新条目时是选择了 Given 还是 Received 状态。考虑到这一点,始终显示一个图像,无论是绿点还是红点。所以我在这里想的是创建一个透明的正方形,然后将 if 语句更改为“如果注意,则显示图钉图像,如果没有,则显示透明图像”。

不过,这感觉有点像 hack,我更喜欢用适当的方法来解决这个问题。

对此的任何想法将不胜感激。

最佳答案

首先,在 cellForRow 中分配 View 是一种不好的做法。 .如果确实需要在cellForRow 中分配 View 仅在需要时执行,在您的情况下为 else陈述。

二、不要使用dispatch_async如果您已经在主线程上,则在主线程上调度(cellForRow 它在主线程上)。

以上几点只是性能提升的一些建议。

作为您的问题的解决方案,我将创建一个自定义 UITableViewCell在它的方法prepareForReuse我会删除 imageView .

编辑
YourCustomCell.m

- (void)prepareForReuse {
[super prepareForReuse];
[[self viewWithTag:YOUR_TAG] removeFromSuperview];
}

这是一个简单的实现,但您必须考虑分配/释放 UIImageView 的成本更高。而不是保留对图像的引用并在不需要时将其隐藏。就像是:
YourCustomCell.h
@interface YourCustomCell : UITableViewCell {
IBOutlet UIImageView *theImageView; // make sure you link the outlet properly ;)
}
YourCustomCell.m
 - (void)prepareForReuse {
[super prepareForReuse];
theImageView.hidden = YES;
}

cellForRow您只需要检查您是否有注释并使 imageView 可见(可能您会将 theImageView 设为属性)

关于ios - UITableViewCell 在滚动时在某些单元格和不同的单元格中显示 UIImageView - 与 CoreData 和 NSFetchedResultsController 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23362121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com