【问题标题】:An efficient way of redrawing a UITableViewCell once its data is available一种在数据可用后重绘 UITableViewCell 的有效方法
【发布时间】:2009-05-23 05:41:43
【问题描述】:

我目前有一个 UITableViewController,其中包含许多包含简单数据的单元格。当 UITableViewController 实例化 UITableViewCell 时,它开始为每个单独的单元格运行一个后台线程,以从服务器获取其状态。 UITableViewCell 是子类,并且已经有一个 UIImageView 属性,一旦来自服务器的数据准备好,就需要将其添加到 contentView 中。

我的问题是,每次从后台线程取回新数据时,我都需要调用 [tableView reloadData]。这有点矫枉过正,因为我可以通过直接访问受影响的单元格来简单地将 UIImageView 添加到 contentView。我只是不确定当我的数据管理实用程序完成工作(与服务器交谈)时找到单元的最佳方法。

在调用我的数据管理器以运行其后台任务时传递单元格的 indexPath,然后在任务完成后将该 indexPath 传回,这样做是否有意义?是不是有点矫枉过正?

你最喜欢处理这个常见任务的方式是什么?

感谢工作人员。

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    如果需要在单元格内更改数据,我不使用 dequeueReusableCellWithIdentifier:(NSString *)identifier 方法。这会阻止 UITableView 缓存单元格。当表格视图单元格滚动离开屏幕时,它们会被释放。有一个委托方法,

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    

    在你的单元格被绘制之前被调用。您可以使用它,是的,将 indexPath 传递给管理器。

    当你的数据回来时,我通常会调用该方法

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    

    获取单元格,然后设置单元格中的文本并调用其 UIView 超类方法, - (void)setNeedsLayout.
    这将告诉单元格重绘。

    我这样做的另一种方法是使用自定义单元格,并让该自定义单元格子类在绘制时直接调用管理器以获取其数据。当数据返回时,它会调用自己的自定义委托方法来更新其内部的 UILabel 对象,然后调用 setNeedsLayout。

    【讨论】:

      【解决方案2】:

      如果您不介意在加载图像时在单元格中使用占位符,您可以在 Three20 库中使用类似 TTImageView 的内容。图像视图始终位于单元格中,您可以指定其图像 URL。图像视图处理 URL 请求,当图像加载时,它会自动显示。

      虽然我不使用 Three20,但我在代码中做了一些非常相似的事情。这与表格单元重用标识符兼容——当一个单元格滚动离开屏幕时,它的图像视图 URL 会更改为一个新值,这会取消 URL 请求(如果它仍在进行中)并开始一个新的请求。结合缓存,当您向上滚动时,图像会立即加载。

      【讨论】:

      • 丹尼尔——行得通。我的问题是,我已经有了图像。我只需要从驻留在服务器上的模型中检索更多信息。所以,我是否应该将逻辑留在单元子类本身或出队过程中。
      • @Steve - 如果附加数据最终改变了单元格高度,那么无论如何您都需要重新加载完整的表格视图。否则,我会让您的单元格成为数据获取请求的代表;类似于 dataRequest:receivedData:
      猜你喜欢
      • 1970-01-01
      • 2021-04-03
      • 2013-05-30
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多