UITableView在滚动时滞后

时间:2012-02-15 01:50:18

标签: objective-c uitableview scroll xcode4.2

这是我的问题: 我滚动它时,我的UITableViewController滞后。它有大约60个自定义单元格。但是,在模拟器上它没有任何滞后。 这是我的代码: 的 CustomCell.m

#import "CustomCell.h"

@implementation CustomCell

@synthesize nameLabel,costLabel,giftPicture;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code


        nameLabel = [[UILabel alloc]init];
        nameLabel.textAlignment = UITextAlignmentLeft;
        nameLabel.textColor = [UIColor colorWithRed:25/256.0 green:98/256.0       blue:52/256.0 alpha:1.0];
        costLabel = [[UILabel alloc]init];
        costLabel.textAlignment = UITextAlignmentLeft;


        giftPicture = [[UIImageView alloc]init];

        [self.contentView addSubview:nameLabel];
        [self.contentView addSubview:costLabel];
        [self.contentView addSubview:giftPicture];

        costLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background4"]];
        nameLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background4"]];
    }
    return self;
}
- (void)layoutSubviews {
    [super layoutSubviews];

    CGRect contentRect = self.contentView.bounds;
    CGFloat boundsX = contentRect.origin.x;
    CGRect frame;
    frame= CGRectMake(boundsX+10,10, 50, 50);
    giftPicture.frame = frame;

    frame= CGRectMake(boundsX+70 ,10, 350, 25);
    nameLabel.frame = frame;

    frame= CGRectMake(boundsX+70 ,40, 350, 18);
    costLabel.frame = frame;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

List.m

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithFrame:CGRectZero];
    }

    // Configure the cell...


    NSString *cellValue = [array1 objectAtIndex:indexPath.row];
    //cell.textLabel.text = cellValue; // загаловок клетки
    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; // сделал чтобы клетка была со стрелочкой

    cell.nameLabel.text = cellValue;

    NSDictionary  *mainDictionary = [[NSDictionary alloc]init];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
    NSString *currentLanguage = [languages objectAtIndex:0];
    if([currentLanguage isEqualToString:@"en"])
    {
        mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"txt"]];
    }
    NSEnumerator *enumerator = [mainDictionary objectEnumerator];
    id returnValue;

    while ((returnValue = [enumerator nextObject]))
    {

        if([cell.nameLabel.text isEqualToString:[returnValue valueForKey:@"name"]] )
        {

            cell.animalPicture.image = [UIImage imageNamed:[returnValue valueForKey:@"icon"]];
            cell.costLabel.text = [NSString stringWithFormat:@"$%@ - $%@",[returnValue valueForKey:@"minAge"],[returnValue valueForKey:@"maxAge"]];

        }
    }
    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 75;
}
@end

我试图让自定义单元格为空(删除标签和图像),只是因为好奇,但它没有改变任何东西。 你能告诉我,我应该检查什么来解决这些滞后问题? 谢谢!

3 个答案:

答案 0 :(得分:4)

在处理iOS应用中的性能问题时,请相信设备,而不是模拟器。我已经看到性能两种方式(有时在模拟器上更好,有时在设备上更好)。记住在设备上进行测试可以为您节省大量时间。

滞后滚动很可能是滚动代码被图像处理或其他网络活动阻止的结果。

我个人对调试这些情况的偏好是从空表视图开始。即使有数千个细胞,这也应该能够顺畅滚动。然后逐个添加tableView内容,并注意滚动开始滞后的时间。

Apple's Lazy Table Images sample code可以提供帮助。

答案 1 :(得分:4)

对于每个表格单元格,您在-cellForRowAtIndexPath方法中使用UIImage进行了大量初始化。您应该只执行一次并缓存图像。

答案 2 :(得分:4)

是的,这只是我想要为每个表格单元做的TON工作(也绝不会永远不相信模拟器的性能,它与设备上的行为方式无关)。你应该尝试使用工具确定准确的时间,但如果我不得不看一下,我会说:

NSDictionary  *mainDictionary = [[NSDictionary alloc]init];

对于初学者来说,这个a)似乎没有意义,因为下一行和b)看起来你正在泄漏这个。

    mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"txt"]];

每次加载此文件的性能都不是很好,您应该将此数据一次性地添加到视图控制器中,而不是每次填写单元格时。

NSEnumerator *enumerator = [mainDictionary objectEnumerator];
id returnValue;

while ((returnValue = [enumerator nextObject]))
{

    if([cell.nameLabel.text isEqualToString:[returnValue valueForKey:@"name"]] )
    {

这一整块,我会重做。这是直截了当的,使用NSDictionary错误。一个字典包含一个Key和一个Value,你不应该用枚举器自己扫描整个东西,通过字符串比较找到你想要的值,你应该使用类似的东西

[mainDictonary objectForKey:@"thingYouWant"];

执行你所说的就像是字典的60个完整枚举和字符串比较对表性能不好并且没有必要。

这将是我工作的东西首先检查性能然后根据需要返工,我愿意打赌你的性能问题包含在那些块中。