UIActivityIndi​​cator 消失

UIActivityIndicator disappears

我有 tableView 行。如果我点击行 UIActivityIndicator 开始动画。但是如果我滚动 tableView 指示器就会消失。如何解决?

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.frame = CGRectMake(0, 0, 24, 24);
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryView = spinner;
[spinner startAnimating];

发生这种情况是因为您的单元格在滚动时重复使用。您需要保存模型中 UIActivityIndicator 动画的状态,并按索引重新加载所需的单元格。

这不是 "what should I add to the code" 问题。这是一个 "I don't understand how table views work" 问题。

逐行告诉您要更改的代码对您没有帮助。相反,您需要研究和理解 table 视图的工作方式。

Table 创建视图单元格,然后一遍又一遍地重复使用。当单元格滚动到屏幕外时,系统会将该单元格从屏幕上移除并将其放入 "recycle bin" 中。当一个新行滚动到视图中时,系统会尝试从回收站中取出一个单元格并使用它来显示新显示行的信息,而不是创建一个新单元格。如果回收站中没有所需类型的单元格,它只会创建一个全新的单元格。一旦您创建了足够的单元格来填满屏幕,当您滚动时,系统可能不需要创建任何新单元格。

返回单元格上的 activity 指示器。

您将 activity 指示器添加到单元格并开始旋转。然后用户将该单元格滚动到屏幕外。该单元格将被重用以显示不同的行。可能在某些时候,您会看到一个新暴露的单元格,其中包含您意想不到的 activity 指示符。

如果用户随后滚动回到您之前添加了 activity 指示符的行,它将不会有旋转的 activity 指示符,除非您为该行设置新的单元格有一个,或者你从回收站得到的电池恰好有一个旋转的 activity 指示器。

任何时候更改单元格的状态,都需要保存有关您对数据模型所做的操作的信息 ("the cell at row 6 is waiting on a download")。

然后,在您的 cellForRowAtIndexPath 方法中,您需要 完全 配置单元格。创建您的单元格原型,使单元格 始终 具有 activity 指示器,但如果不旋转则隐藏。如果一行的单元格需要 activity 指示器旋转,请将其设置为旋转。如果它不需要旋转 activity 指示器,请将指示器显式设置为 NOT 旋转状态(因为您可能正在处理一个回收的电池,该电池被丢弃到带有旋转 activity 指示器的回收站中).同时将所有文本 fields/labels/text 视图设置为默认状态。假设单元格上可能已从默认状态更改的每个视图都已从默认状态更改,并将其明确设置为默认状态。

虽然这里的答案并不完全错误,但我认为它们没有涵盖 UITableViewCell 中的 UIActivityIndicatorView 的具体问题。

我在仅包含 activity 指示符的自定义单元格中遇到了类似的问题。如果我将指示器设置为在单元初始化时开始动画,它会正确加载并且指示器正在旋转。但是,当单元格出队时,指示符丢失。

按照说明 here 我尝试将 hidesWhenStopped 设置为 false,这次当单元格出队时指示器可见,但动画已停止。所以我唯一可以从中推断出的是,当单元格从 table 中移除时,系统会自动停止指示器的动画。

修复与其他答案中描述的相同,并且在将单元格出列时,您需要在指标上调用 startAnimating()