我正在尝试实现类似iOS 6日历中的事件表。
我有一个带有500个行(事件)的UITableView。当我开始滚动时,动画是流畅的。
但在两百行之后开始出现卡顿。在本机iOS 6日历事件列表中,所有工作都很顺畅。
- (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;
}
}
请帮助我。