UITableView很慢,即使只有几个对象?

时间:2010-02-15 13:14:39

标签: iphone iphone-sdk-3.0 uitableview

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView setRowHeight:100];
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.view setBackgroundColor:[UIColor groupTableViewBackgroundColor]];
}


#pragma mark -
#pragma mark Table view data source

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 3;
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 100) reuseIdentifier:CellIdentifier] autorelease];

        // For Name/Phone: 
        UITextField *name = [[[UITextField alloc] initWithFrame:CGRectMake(75, 22, 200, 25)] autorelease];
        [name setFont:[UIFont systemFontOfSize:14]];
        [name setPlaceholder:@"John Doe"];
        [name setReturnKeyType:UIReturnKeyDone];
        [name setAutocapitalizationType:UITextAutocapitalizationTypeWords];
        [name setAutocorrectionType:UITextAutocorrectionTypeNo];
        [name setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];

        UITextField *phone = [[[UITextField alloc] initWithFrame:CGRectMake(75, 67, 200, 25)] autorelease];
        [phone setFont:[UIFont systemFontOfSize:14]];
        [phone setPlaceholder:@"0412 123 123"];
        [phone setReturnKeyType:UIReturnKeyDone];
        //[phone setKeyboardType:UIKeyboardTypePhonePad];
        [phone setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];

        UIImageView *background = [[[UIImageView alloc] initWithFrame:CGRectMake(9, 11, 302, 89)] autorelease];
        background.image = [UIImage imageNamed:@"book-personaldetailsbg.png"];

        // Add to the View
        [cell addSubview:background];
        [cell addSubview:name];
        [cell addSubview:phone];

        // Add actions:
        [name addTarget:self action:@selector(textFieldDone:) forControlEvents:UIControlEventEditingDidEndOnExit]; 
        [phone addTarget:self action:@selector(textFieldDone:) forControlEvents:UIControlEventEditingDidEndOnExit]; 

    }

    return cell;
}

这有什么理由吗?我只设置了一些物体,所以我几乎看不出它为什么会滞后。它跳了,而不是我的手机,因为设置应用程序工作正常。

4 个答案:

答案 0 :(得分:10)

由于手机呈现每一层的方式,带有许多子视图的UITableViewCells在iPhone上渲染速度很慢。

阅读本文:http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/

上述帖子中的信息仍然非常重要且有用,但示例项目下载链接已被破坏(截至2011年12月8日)。但是,Apple自己的表格视图文档中有平板表格单元格的示例,可以快速滚动日志。看看:http://developer.apple.com/library/ios/#samplecode/AdvancedTableViewCells/Introduction/Intro.html

要点是:

  • iPhone不能很快处理Alpha
  • 子视图的opaque属性设置为YES
  • 如果可能,请将您的子视图绘制到一个不透明的视图中,以获得最佳性能。

显然,带有需要操作的控件的单元格无法展平,因此我认为您只需要尝试确保您的单元格子视图不透明。

我建议的最后一件事是每次请求单元时都不分配新对象 - 这肯定是代码中的瓶颈。您应该使用可重用单元格,并对单元格进行子类化,以便仅在第一次创建时将其字段分配并添加为子视图。后续调用应使单元格出列,并使用prepareForReuse清除其旧值。

答案 1 :(得分:0)

我认为你不应该像你一样设置细胞高度。我相信你应该实现heightForCellAtIndexPath方法(可能没有100%正确的名称),它会询问你的代表它应该为每个单独的单元格设置多高。如果没有采用“正确”的方式,我觉得我听说过性能问题。 IMHO

如果我是你,我会尝试的第一件事就是注释掉所有与图片相关的代码,看看桌子是否会大幅加速。

答案 2 :(得分:0)

首先删除该单元格背景。看看是否有所作为。

答案 3 :(得分:0)

这里的解决方案人员,在块中添加图像加载,就是这样:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^{
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:
                                                      [[feeds objectAtIndex:indexPath.row]
                                                       objectForKey: @"url"]]];
        UIImage *image = [UIImage imageWithData:data];
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.imagen.image = image;
        });

使用Grand Central Dispatch优先考虑。 我可以解释是否有人想要,只需发送电子邮件至info@tonymedrano.com