gpt4 book ai didi

ios - 向上或向下滚动 UITableview 时更改值

转载 作者:行者123 更新时间:2023-12-01 15:53:32 25 4
gpt4 key购买 nike

我有一个 UITableview,它有一些历史记录。我正在使用自定义单元格来处理标签、图像和按钮的显示。 UITableview 中大约有 50 行。但问题是当 Tableview 向上滚动时,第一个显示的下面的行中的值发生了变化。不确定 Tableview 到底发生了什么。

static NSString *CellIdentifier = @"HistoryCell";
cellHistory = [self.notificationTableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

[cellHistory.label clearActionDictionary];
//Step 2: Define a selection handler block
void(^handler)(FRHyperLabel *label, NSString *substring) = ^(FRHyperLabel *label, NSString *substring)
{
[self userNameTapped:[[[[self.arrayHistory objectAtIndex:indexPath.row] objectForKey:Details] objectForKey:@"key"] objectForKey:@"key"]];
};

//Step 3: Add link substrings
[cellHistory.label setLinksForSubstrings:@[userName] withLinkHandler:handler];
return cellHistory;

最佳答案

小心

以下答案针对的是具体实现,而不是设计。为 NSFetchedResultsController 使用样板代码将首先阻止此错误的发生。 (Apple documentation)。无论如何,避免操作 cellForRowAtIndexPath 返回的单元格:您拥有它。


<强>1。不缓存重复使用的单元格

特别令人担忧的是:

[self.arrayHistory objectAtIndex:indexPath.row]

不是因为那个特定的实例,而是因为它让我认为你在这个类的其他地方做出假设:通过 dequeueReusableCellWithIdentifier 检索的 UITableViewCell 什么都不是但是一个临时对象,纯粹用于显示 UITableView

随着时间的推移,同一个单元格实例将具有多个 indexPath:这样的单元格可能不会在以后的日期被缓存或操作。一旦作为 cellForRowAtIndexPath 的最后一条语句返回,它可能不会再次被访问,无论是否通过某种异步方法由外部指针保留。始终将通过 dequeueReusableCellWithIdentifier 获取的缓存 TableView 的索引路径视为陈旧

返回后不要修改单元格的内容。遵循 Losiowaty 概述的正确设计下面。

根据更好的判断,如果您必须修改已经返回到 TableView 的单元格的内容,那么您必须为此指定一个持久单元格,例如,使用 UITableViewCell 的字典。您不能在此类单元格上调用 dequeueReusableCellWithIdentifier 除非该标识符专用于该单元格;虽然对于大型数据集来说内存效率非常低,但它将保证单元不会被重复使用。


<强>2。不要猜tableview

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
cellHistory = [self.notificationTableView // etc.

UITableViewDataSource cellForRowAtIndexPath 中的正确逻辑是使用传递给您的参数:

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
cellHistory = [tableView // etc.

<强>3。重复使用干净的回收电池

假设您已经掌握了使用dequeueReusableCellWithIdentifier 的回收副作用,并确保您不会交叉授粉不同类型的细胞,您可能需要 cleanup你重复使用的单元格(他的评论归功于Timur Bernikowich):

func prepareForReuse() {
super.prepareForReuse()
// reset attributes of the cell that are not related to content
}

<强>4。先自省(introspection)

总是更喜欢我做错了什么,而不是它曾经在以前的操作系统中工作。虽然第二个命题通常是正确的,但总的来说,历史让你思考它最初在天堂是如何运作的。

相反,我通常将这些情况视为我做错了可怕事情的明确信号,我只是幸运地从裂缝中掉了下来。


<强>5。尊重命名约定

虽然我很欣赏你在方法中传递方 block

- (void)setLinksForSubstrings:(NSArray*)string withLinkHandler:(void(^)(FRHyperLabel *label, NSString *substring))handler {}

Details 对象或 userName 的性质让我有些迷惑,更不用说 [self userNameTapped:[[[ [。如果我被抛弃了,其他工程师在第一次接触您的代码时很可能也会这样。

从上下文中,我无法推导出什么是变量、常量、静态、实例属性等。您的单元格也很可能在那个级别被混淆(您可能正在重复使用您认为是本地或基于堆栈的值,但实际上不是)。

我可以建议对 block 使用 typedef,采用大写一致性,并避免嵌套 [ 太深。将您的代码与样板 UITableView 代码进行比较需要付出不小的努力,只是为了消除噪音。

关于ios - 向上或向下滚动 UITableview 时更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33461141/

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