滚动时UITableview滞后。 [英] UITableview lags when scrolling.

查看:79
本文介绍了滚动时UITableview滞后。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现iOS 6日历中的事件表。

I'm trying to implement events table like in iOS 6 calendar.

我有500行(事件)的UITableView。当我开始滚动动画是顺利的。

I have UITableView with 500 rows(events). When I start scrolling animation is smooth.

但是在两百行开始后滞后。在原生iOS 6日历事件列表中所有工作顺利进行。

But after two hundred rows begins lags. In native iOS 6 calendar events list all work smoothly.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    double begin = CFAbsoluteTimeGetCurrent();
    if(!self.isNoResults)
    {
        NSString *cellIdentifier = [NSString stringWithFormat: @"Cell %i %i", indexPath.row, indexPath.section];
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        UIImageView *circleImgView;
        NSString *startTimeStr;
        NSDateFormatter *formatter;
        UILabel *timeLbl;
        UILabel *titleLbl;
        UILabel *endsLbl;
        UIImageView *eventTypeImgView;
        if(cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
            circleImgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"newMesIcon.png"]];
            circleImgView.frame = CGRectMake(14, 19, 12, 12);
            [cell.contentView addSubview:circleImgView];



            timeLbl = [[UILabel alloc] init];
            [timeLbl setBackgroundColor:[UIColor clearColor]];
            timeLbl.frame = CGRectMake(35, 15, 200, 20);
            timeLbl.font = [UIFont systemFontOfSize:13];
            timeLbl.tag = 333;
            [cell.contentView addSubview:timeLbl];

            titleLbl = [[UILabel alloc] init];
            titleLbl.frame = CGRectMake(123, 15, 200, 20);
            titleLbl.font = [UIFont fontWithName:@"Arial-BoldMT" size:18];
            [titleLbl setBackgroundColor:[UIColor clearColor]];
            titleLbl.tag = 444;
            [cell.contentView addSubview:titleLbl];
            [cell.contentView setBackgroundColor:[UIColor colorWithRed:243 / 255.0 green:245 / 255.0 blue:247 / 255.0 alpha:1.0]];

            endsLbl = [[UILabel alloc] init];
            [endsLbl setBackgroundColor:[UIColor clearColor]];
            endsLbl.frame = CGRectMake(49, 11, 40, 8);
            [endsLbl setFont:[UIFont fontWithName:@"Arial-BoldMT" size:7]];
            [endsLbl setTextColor:[UIColor redColor]];
            endsLbl.tag = 555;
            [cell.contentView addSubview:endsLbl];

            eventTypeImgView = [[UIImageView alloc] init];
            eventTypeImgView.frame = CGRectMake(95, 16, 16, 17);
            eventTypeImgView.tag = 666;
            [cell.contentView addSubview:eventTypeImgView];
        }


        startTimeStr = [[self.sortedEventsDict[[[[self.sortedEventsDict allKeys] sortedArrayUsingSelector:@selector(compare:)] objectAtIndex:indexPath.section]]  objectAtIndex:indexPath.row] valueForKey:@"starts"];

        formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyy-MM-dd HH:mm"];
        NSDate *startDate = [formatter dateFromString:startTimeStr];
        NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
        [timeFormatter setDateFormat:@"HH:mm"];
        NSString *timeStr = [timeFormatter stringFromDate:startDate];


        NSString *endTimeStr = [[self.sortedEventsDict[[[[self.sortedEventsDict allKeys] sortedArrayUsingSelector:@selector(compare:)] objectAtIndex:indexPath.section]]  objectAtIndex:indexPath.row] valueForKey:@"ends"];
        NSDateFormatter *endformatter = [[NSDateFormatter alloc] init];
        [endformatter setDateFormat:@"yyy-MM-dd HH:mm"];
        NSDate *endDate = [endformatter dateFromString:endTimeStr];
        NSDateFormatter *endtimeFormatter = [[NSDateFormatter alloc] init];
        [endtimeFormatter setDateFormat:@"HH:mm"];
        NSString *endTime = [endtimeFormatter stringFromDate:endDate];


        if([[[self.sortedEventsDict[[[[self.sortedEventsDict allKeys] sortedArrayUsingSelector:@selector(compare:)] objectAtIndex:indexPath.section]]  objectAtIndex:indexPath.row] valueForKey:@"type"] isEqualToString:@"event"])
        {
            ((UIImageView *)[cell.contentView viewWithTag:666]).image = [UIImage imageNamed:@"eventsIcon.png"];
        }
        else
        {
            ((UIImageView *)[cell.contentView viewWithTag:666]).image = [UIImage imageNamed:@"appointmentsIcon.png"];
        }

        ((UILabel *)[cell.contentView viewWithTag:555]).text = @"";
        if([timeStr isEqualToString:@"00:00"] && [endTime isEqualToString:@"23:59"])
        {
            timeStr = @"all-day";

        }

        else if([timeStr isEqualToString:@"00:00"] && ![endTime isEqualToString:@"23:59"])
        {
            timeStr = endTime;

            ((UILabel *)[cell.contentView viewWithTag:555]).text = @"ENDS";

        }


        ((UILabel *)[cell.contentView viewWithTag:333]).text = timeStr;
        ((UILabel *)[cell.contentView viewWithTag:444]).text = [[self.sortedEventsDict[[[[self.sortedEventsDict allKeys] sortedArrayUsingSelector:@selector(compare:)] objectAtIndex:indexPath.section]]  objectAtIndex:indexPath.row] valueForKey:@"title"];

        startDate = nil;
        timeFormatter = nil;
        timeStr = nil;
        endTimeStr = nil;
        endformatter = nil;
        endDate = nil;
        endtimeFormatter = nil;
        endTime = nil;
        startTimeStr = nil;
        formatter = nil;
        [cell setBackgroundColor:[UIColor colorWithRed:243 / 255.0 green:245 / 255.0 blue:247 / 255.0 alpha:1.0]];
        double finish = CFAbsoluteTimeGetCurrent();
        NSLog(@"TIME DIFF = %f", finish - begin);
        return cell;
    }
    else
    {
        NSString *cellIdentifier = [NSString stringWithFormat: @"Cell No Results %i %i", indexPath.row, indexPath.section];
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
            if(indexPath.row == 2)
            {
                UILabel *noResultsLbl = [[UILabel alloc] init];
                noResultsLbl.text = self.noResultsString;
                [noResultsLbl setFont:[UIFont fontWithName:@"Arial-BoldMT" size:20]];
                [noResultsLbl setTextColor:[UIColor colorWithRed:204 / 255.0 green:204 / 255.0 blue:204 / 255.0 alpha:1.0]];
                noResultsLbl.frame = CGRectMake(60, 15, 200, 20);
                noResultsLbl.textAlignment = NSTextAlignmentCenter;
                [cell.contentView addSubview:noResultsLbl];
            }

        }
        [cell.contentView setBackgroundColor:[UIColor colorWithRed:243 / 255.0 green:245 / 255.0 blue:247 / 255.0 alpha:1.0]];
        cell.userInteractionEnabled = NO;
        double finish = CFAbsoluteTimeGetCurrent();
        NSLog(@"TIME DIFF = %f", finish - begin);
        return cell;
    }
}

请帮助我。

推荐答案

你的 cellForRowAtIndexPath 是140行,这就是它不能顺利运行的原因。我建议仔细检查代码并尝试尽可能地重构代码。格式化程序非常昂贵,而且你可以分配/启动几个。制作原型或基于xib的单元格,而不是每次都以编程方式设置它。我还建议不要在视图中使用标签,将其放入xib或原型单元格并将其作为插座。

Your cellForRowAtIndexPath is 140 lines long, that is the reason its not running smoothly. I would recommend going over the code and trying to refactor out as much as you can. Formatters are incredibly expensive, and you're alloc/initing several. Make a prototype or xib based cell rather than setting it up programmatically every single time. Id also recommend against using tags for views, put that into a xib or prototype cell and make it an outlet.

这些更改将加快滚动速度。

Those changes will speed up your scrolling.

这篇关于滚动时UITableview滞后。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆