代码之家  ›  专栏  ›  技术社区  ›  anon

一种在uitableviewcell的数据可用时重新绘制它的有效方法

  •  4
  • anon  · 技术社区  · 15 年前

    我现在有一个uitableviewcontroller,它包含许多包含简单数据的单元格。当uitableviewcontroller实例化uitableviewcell时,它开始为每个单独的单元格运行一个后台线程,以便从服务器获取其状态。uitableviewcell是子类,并且已经有一个uiimageview属性,一旦来自服务器的数据就绪,就需要将该属性添加到contentview。

    我的问题是每次从后台线程获取新数据时都需要调用[TableView ReloadData]。这有点过分,因为我可以直接访问受影响的单元格,将uiimageview添加到contentview中。我只是不确定在我的数据管理实用程序完成其工作时(与服务器对话)找到单元的最佳方法。

    这样做是否有意义,例如在调用数据管理器运行其后台任务时传递单元格的indexpath,然后在任务完成时传递该indexpath?是不是太过分了?

    你最喜欢用什么方法来处理这个常见的任务?

    谢谢大家。

    2 回复  |  直到 15 年前
        1
  •  5
  •   Heat Miser    15 年前

    在需要在单元格内部更改数据的情况下,我不使用dequeuereusablecellwithidentifier:(nsstring*)标识符方法。这将阻止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
  •  0
  •   Daniel Dickison    15 年前

    如果在加载图像时不介意在单元格中使用占位符,可以使用 TTImageView 在320图书馆。图像视图始终位于单元格中,您可以指定其图像URL。图像视图处理url请求,当加载图像时,它将自动显示。

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