在UITableView执行“tableView:heightForRowAtIndexPath:”时加载屏幕

时间:2010-09-06 03:47:51

标签: iphone objective-c uitableview

我正在使用tableView:heightForRowAtIndexPath:UITableView中的每个表格单元格设置自定义高度。这是一项昂贵的操作,但我还没有办法加快速度(将来我会尝试taber提到的一些方法)。

现在我只想显示某种加载屏幕。它不需要动画,只要在加载表视图时它是可见的。这可能吗?

编辑:我已经尝试了loading screen method mentioned in taber's answer,但由于它在与UITableView相同的线程中运行,因此在表视图加载完成后才会出现,因此在这种情况下不太有用:)

1 个答案:

答案 0 :(得分:1)

尝试#3:

您可以在表格视图的顶部添加一个活动指示器作为新视图...例如:http://tapadoo.com/2009/iphone-how-to-do-full-screen-activity-status - 然后诀窍就是弄清楚它何时实际完成。我想在你的heightForRowAtIndexPath:方法中你可以保留某种行计数,并检查该计数是否是> =你的数据模型行数。这样做有用吗?

尝试#2:

尝试完全注释掉被覆盖的 tableView:heightForRowAtIndexPath:方法,而不是在 cellForRowAtIndexPath 中创建单元格的地方尝试类似这样的内容:



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

  CGRect contentRectTall = CGRectMake(0.0, 0.0, 302.0, 140.0);
  CGRect contentRectMed = CGRectMake(0.0, 0.0, 302.0, 70.0);
  CGRect contentRectSmall = CGRectMake(0.0, 0.0, 302.0, 42.0);

  ... cell dequeue etc ...

  if ( ...the type of this cell is kRowTypeTall for example... ) {
    cell = [[[UITableViewCell alloc] initWithFrame:contentRectTall reuseIdentifier:CellIdentifier] autorelease];
    ...
  } else if ( ...the cell type is kRowTypeMed ) {
    ...
  } else if ( ...the cell type is kRowTypeSmall ) {
    ...
  }

  ... other cell customization ...

}

除此之外,您可能需要查看“延迟加载”,其中您将加载前50个单元格,然后在末尾添加“加载50多个”类型的按钮。


如果你已经知道你的行类型(包含在某种数据源中),那么它应该很快就可以了。

像...一样的东西。


enum {
  kRowTypeHuge = 0,
  kRowTypeMed,
  kRowTypeSmall
};

-(id)init {
  ...
  NSArray *tableRows = [[NSArray alloc] initWithObjects:
    [NSNumber numberWithUnsignedInt: 0],
    [NSNumber numberWithUnsignedInt: 1],
    [NSNumber numberWithUnsignedInt: 0],
    [NSNumber numberWithUnsignedInt: 0],
    [NSNumber numberWithUnsignedInt: 2],
    nil
  ];
  self.rows = tableRows;
  [tableRows release];
  ...
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  NSUInteger rowType = [[[self.rows] objectAtIndex: indexPath.row] unsignedIntValue];
  if(rowType == kRowTypeHuge) {
    return 105.0;
  } else if(rowType == kRowTypeMed) {
    return 44.0;
  }
  return 20.0;
}

积极地认为heightForRowAtIndexPath是问题...这样的事情会变得超级快吗?


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  return 52.0;
}