2017-03-03 42 views
0

我在想如何正确初始化我的单元格,因为当它们为初始加载的简单单元格渲染时非常平滑+快速时,在滚动更复杂的类型时会出现明显的混乱现象。我该如何正确地初始化一个UITableViewCell

由于这些单元格在可见一次后也能顺利滚动,因此我怀疑初始化是在单元格第一次显示时发生的。

本质上,我想人工镜像无论平台在做什么,而应用程序是空闲的,以防止用户遇到这种混乱。

不幸的是,我似乎无法完成这个完美的任务。

虽然GetCell部分调用已经明显平滑了这个hickup,但是当第一次显示一个单元格时,仍然会有轻微的fps下降。

这里就是我已经尝试过(注意,注释掉部分对加快初始化影响不大。):

public void Prefetch(int start, int range) 
     { 
      Debug.WriteLine(nameof(Prefetch)); 
      var current = start; 
      var end = start + range; 
      var tv = GetTableView(); 
      while (current < ItemsSource.Count && current < end) 
      { 
       if (_prefetchedCellIndices.Contains(current)) 
       { 
        current++; 
        continue; 
       } 

       var cell = GetCell(tv, NSIndexPath.FromRowSection(current, 0)); 
//    cell.SetNeedsLayout(); 
//    cell.LayoutIfNeeded(); 
//    cell.SetNeedsUpdateConstraints(); 
//    cell.UpdateConstraintsIfNeeded(); 
//    cell.Init(); 
       current++; 
      } 
     } 
+1

就我个人而言,我会避免为项目源中的每个数据元素“预先创建”一个单元格,对于几个单元格,但是,一旦数据元素的数量超过了您尝试使用的UITableView中单元格的可视数量掩盖用户可能永远不需要的细胞创建和存储使用不足的内存和cpu的底层问题。我将在'cellForRowAtIndexPath:'cell内创建你的单元格内容,导致你的根问题,并着重于在尝试沿着预取单元格的路径进行修正之前,如果用户向下/向上滚动,可能会看到下一个单元格。 – SushiHangover

回答

0

这完全取决于你想在更复杂的细胞显示的内容。例如,如果已经有一个具有相同重用标识的单元准备好填充tableview,它就不会使用太多的资源来重用UIControls,如按钮,UISwitch等。根据我的经验,一些用来填充更多资源的元素是UIImageView,例如,您可能从URL获取图像。我强烈建议的是,你应该创建数组或者任何需要用来填充相关单元格的数据的列表,然后使用IndexPath.Row来获取它们。尝试从URL中'预先下载'图像等。可能值得关注Xamarin开发人员网站上的文档,因为他们承认表视图是可能需要开发人员注意优化的元素。

Xamarin Optimisation Page

注:我不会尝试“预缓存”的细胞的iOS已经做的是因此“再利用标识符”。我只是试图“预先缓存”任何可能需要一段时间才能显示的数据。