我有一个动态的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上进行测试,这可能是一个影响因素。
有没有人对我可能做错了什么或能做些什么来加快速度?
答案 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;
}