2

我正在开发一个从 Web 服务解析数据并显示在表格视图中的项目。一切正常,但我对tableview的表现并不满意。从 web 解析数据后,我调用了 reload data 来显示数据,但它没有立即显示单元格。它显示 10/15 秒后的数据。在调用重新加载数据之前,我已经检查了所有数据是否已加载。奇怪的是,如果我尝试拖动表格,它会立即显示单元格。

任何的想法?

更新

-(void)receivedCategories:(NSMutableArray *)categoryItems{
  [self.spinner stopAnimating];
  self.categories=categoryItems;
  if (self.tableView!=nil) {
    [self.tableView reloadData];
  }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return [self.categories count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"CategoryCell";
  CategoryCell    *cell           = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  cell.category                   = [self.categories objectAtIndex:indexPath.row];
  return cell;
}

CategoryCell.m

@implementation CategoryCell

- (void)setCategory:(Category *)category
{
  [self.categoryTitle setText:category.title ];
  [self.categorySubTitle setText:category.description];
}

@end
4

5 回答 5

24

看来您没有[self.tableView reloadData];从主线程调用,这可能是您的问题的原因。

你可以试试:

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];

另请在此处查看接受的答案以获取更多信息。

于 2012-10-17T05:10:14.820 回答
1

我遇到了同样的问题,[tableview reloaddata] 和调用方法 [cellForRowAtIndexPath] 的应用程序之间的时间间隔太长(几秒钟)。将 [reloaddata] 方法放在 a dispatch_async(dispatch_get_main_queue(), ^{}中解决了这个问题。

于 2015-05-19T21:17:57.087 回答
1

您是否使用自定义字体?

我有一个非常相似的问题,我的 UITableView 需要很长时间才能加载。我终于找到了解决方案,它与我的代码或我加载自定义单元格的方式没有任何关系。

问题发生在运行时,当系统从情节提要加载我的自定义 UITableViewCells(带有预定义的自定义字体)时,由于自定义字体没有正确安装,系统会到处寻找字体文件,导致相当大的加载文件时滞后。

为确保您的字体已正确安装:

  1. 在你的 XCode 项目中包含你的字体
  2. 确保它们包含在目标中
  3. 仔细检查您的字体是否作为资源包含在您的捆绑包中
  4. 在您的应用程序列表中包含您的 iOS 自定义字体
  5. 查找字体名称(要找到正确的名称,可以打印所有已安装的字体)

    for (NSString* family in [UIFont familyNames]){
    
        NSLog(@"Family %@", family);
    
        for (NSString* name in [UIFont fontNamesForFamilyName: family]){
    
            NSLog(@"\t Font%@", name);
        }
    }
    
  6. 使用 UIFont 并指定字体的名称

    [UIFont fontWithName:@"FONT_NAME" size:size];
    
于 2016-07-13T10:27:54.740 回答
0

对于您显示的代码量(无),我不得不说您遇到的性能损失是因为您正在调用具有大量记录的 reloadData,或者因为您正在执行一些耗时的解析/计算创建单元格。此外,如果您在这些单元格上显示图像,也可能会导致性能问题。

于 2012-10-16T14:12:09.543 回答
-1

当你创建 CategoryCell?在第一次 dequeueReusableCell 将返回 nil。然后制作类别单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"CategoryCell";
  CategoryCell    *cell           = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (!cell) {
    cell = [[[CategoryCell alloc] init] autorelease];   }

  cell.category                   = [self.categories objectAtIndex:indexPath.row];
  return cell;
}
于 2012-10-16T14:32:26.787 回答