对于包含UIDatePicker的单元格,dequeueReusableCellWithIdentifier需要0.5秒

时间:2013-11-21 16:41:12

标签: ios uitableview uidatepicker

我有一个动态的tableview,其中选择了一个单元格,并在其下方显示另一个包含UIDatePicker的单元格 - 就像在日历应用程序中一样。

这非常有效,但是当用户第一次滚动它时(当它的高度为0时),我遇到单元初始加载的问题。

调查为什么它很慢我在NSLogs中包装dequeueReusableCellWithIdentifier调用来查看时间。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = [[cellIdentifiers objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    NSLog(@"Creating cell:%@", CellIdentifier);
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    NSLog(@"Finished cell:%@", CellIdentifier);
    return cell;
}

NSLog显示:

14:47:42.427 Creating cell:Date
14:47:42.437 Finished cell:Date
14:47:42.470 Creating cell:DatePicker
14:47:43.006 Finished cell:DatePicker
14:47:43.046 Creating cell:Time
14:47:43.055 Finished cell:Time
14:47:44.753 Creating cell:DatePicker
14:47:45.253 Finished cell:DatePicker

日期/时间是包含2个UILabel的单元格,DatePicker是包含UIDatePicker的单元格。

UIDatePicker单元格需要大约半秒钟才能完成。在第一次滚动之后,它加载得更快,因此没有明显的延迟 - 除了第一次点击日期单元格,因此它下面的DatePicker单元格将其高度从0更改为220.

NSLog首先打开单元格:

14:59:34.334 Creating cell:DatePicker
14:59:34.877 Finished cell:DatePicker

我注意到日历应用在第一次打开UIDatePicker单元格时有轻微的延迟,但这似乎并不像我的应用程序那样长。

我正在iPhone 4上进行测试,这可能是一个影响因素。

有没有人对我可能做错了什么或能做些什么来加快速度?

1 个答案:

答案 0 :(得分:5)

我通过从单元格中删除UIDatePicker,以编程方式创建UIDatePicker并将其作为子视图添加到cellForRowAtIndexPath中的单元格contentView来解决此问题。

我在viewDidLoad中初始化了一个datePicker和timePicker。

- (void)viewDidLoad
{
    [super viewDidLoad];
    datePicker = [[UIDatePicker alloc] init];
    [datePicker setDatePickerMode:UIDatePickerModeDate];
    timePicker = [[UIDatePicker alloc] init];
    [timePicker setDatePickerMode:UIDatePickerModeTime];
}

然后在cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    NSString *CellIdentifier = [[cellIdentifiers objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

    cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if ([CellIdentifier isEqualToString:@"DatePicker"] && datePickerOpen)
    {
        [cell.contentView addSubview:datePicker];
    }
    else if ([CellIdentifier isEqualToString:@"TimePicker"] && timePickerOpen)
    {
        [cell.contentView addSubview:timePicker];
    }

    return cell;
}