在 iOS 7 中重用 UIPickerView 中的视图

Posted

技术标签:

【中文标题】在 iOS 7 中重用 UIPickerView 中的视图【英文标题】:Reusing view in UIPickerView with iOS 7 【发布时间】:2013-12-17 13:49:42 【问题描述】:

EDIT 12-14-2015 : 这个问题在 ios 7、iOS 8、iOS 9 上再次频繁报告...。我认为 Apple 不再需要这种控制,应该禁止我们用它而不是让这么大的bug

我使用 UIPickerView 和从 Xib 加载的自定义视图。 我用的是方法

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row 
    forComponent:(NSInteger)component reusingView:(UIView *)view

从 UIPickerViewDelegate 重用我的视图。

在 iOS 6 中,我的 UIPickerview 可以完美运行,并且我的视图可以重复使用。

从 iOS 7 开始,reusingView 总是为零,所以我需要为每一行加载 NIB(我有 250 行)。我的观点是做一些处理,所以它可能会占用一小部分内存,但 x250 = 大内存泄漏。

为了确定问题出在哪里,我用 UILabel 做了一个简单的项目:

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 

    UILabel *label = (UILabel *)view;
    if(view == nil) 
        label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, pickerView.frame.size.width, 76)];
    
    else 
        NSLog(@"*******************************************************");
    
    NSLog(@"Current inndex : %i",row);
    label.text = [NSString stringWithFormat:@"TITRE %i", row];
    return label;

在 iOS 6 中,我的视图被正确地重用了:

2013-12-17 14:27:25.395 EssaiReusedViewPicker[261:907] 当前索引 : 220 2013-12-17 14:27:25.396 EssaiReusedViewPicker[261:907] ****************************************************** ***** 2013-12-17 14:27:25.397 EssaiReusedViewPicker[261:907] 当前索引:221 2013-12-17 14:27:25.404 EssaiReusedViewPicker[261:907] ****************************************************** ***** 2013-12-17 14:27:25.407 EssaiReusedViewPicker[261:907] 当前索引:222 2013-12-17 14:27:25.409 EssaiReusedViewPicker[261:907] ****************************************************** ***** 2013-12-17 14:27:25.410 EssaiReusedViewPicker[261:907] 当前索引:223 2013-12-17 14:27:25.411 EssaiReusedViewPicker[261:907] ****************************************************** ***** 2013-12-17 14:27:25.412 EssaiReusedViewPicker[261:907] 当前索引:224 2013-12-17 14:27:25.414 EssaiReusedViewPicker[261:907] ****************************************************** ***** 2013-12-17 14:27:25.415 EssaiReusedViewPicker[261:907] 当前索引:225 2013-12-17 14:27:25.420 EssaiReusedViewPicker[261:907] ****************************************************** ***** 2013-12-17 14:27:25.424 EssaiReusedViewPicker[261:907] 当前索引:227 2013-12-17 14:27:25.425 EssaiReusedViewPicker[261:907]

但在 iOS 7 中,这是一个全新的故事……:

2013-12-17 14:36:09.555 EssaiReusedViewPicker[7209:70b] Current inndex : 0
2013-12-17 14:36:09.557 EssaiReusedViewPicker[7209:70b] Current inndex : 1
2013-12-17 14:36:09.557 EssaiReusedViewPicker[7209:70b] Current inndex : 2
2013-12-17 14:36:09.560 EssaiReusedViewPicker[7209:70b] Current inndex : 0
2013-12-17 14:36:09.560 EssaiReusedViewPicker[7209:70b] Current inndex : 1
2013-12-17 14:36:09.561 EssaiReusedViewPicker[7209:70b] Current inndex : 2
2013-12-17 14:36:09.563 EssaiReusedViewPicker[7209:70b] Current inndex : 0
2013-12-17 14:36:09.563 EssaiReusedViewPicker[7209:70b] Current inndex : 1
2013-12-17 14:36:09.564 EssaiReusedViewPicker[7209:70b] Current inndex : 2
2013-12-17 14:36:09.566 EssaiReusedViewPicker[7209:70b] Current inndex : 0
2013-12-17 14:36:09.567 EssaiReusedViewPicker[7209:70b] Current inndex : 1
2013-12-17 14:36:09.567 EssaiReusedViewPicker[7209:70b] Current inndex : 2
2013-12-17 14:36:09.568 EssaiReusedViewPicker[7209:70b] Current inndex : 1
2013-12-17 14:36:09.568 EssaiReusedViewPicker[7209:70b] Current inndex : 2
2013-12-17 14:36:09.569 EssaiReusedViewPicker[7209:70b] Current inndex : 0
2013-12-17 14:36:09.569 EssaiReusedViewPicker[7209:70b] Current inndex : 1
2013-12-17 14:36:14.172 EssaiReusedViewPicker[7209:70b] Current inndex : 3
2013-12-17 14:36:14.350 EssaiReusedViewPicker[7209:70b] Current inndex : 3
2013-12-17 14:36:14.351 EssaiReusedViewPicker[7209:70b] Current inndex : 2
2013-12-17 14:36:14.367 EssaiReusedViewPicker[7209:70b] Current inndex : 4
2013-12-17 14:36:14.667 EssaiReusedViewPicker[7209:70b] Current inndex : 4
2013-12-17 14:36:14.668 EssaiReusedViewPicker[7209:70b] Current inndex : 3
2013-12-17 14:36:14.700 EssaiReusedViewPicker[7209:70b] Current inndex : 5
2013-12-17 14:36:15.067 EssaiReusedViewPicker[7209:70b] Current inndex : 5
2013-12-17 14:36:15.067 EssaiReusedViewPicker[7209:70b] Current inndex : 4
2013-12-17 14:36:15.083 EssaiReusedViewPicker[7209:70b] Current inndex : 6
2013-12-17 14:36:15.367 EssaiReusedViewPicker[7209:70b] Current inndex : 6
2013-12-17 14:36:15.367 EssaiReusedViewPicker[7209:70b] Current inndex : 5
2013-12-17 14:36:15.400 EssaiReusedViewPicker[7209:70b] Current inndex : 7
2013-12-17 14:36:16.416 EssaiReusedViewPicker[7209:70b] Current inndex : 7

那怎么了? iOS 还是...?

【问题讨论】:

“(我有 250 行)”,您是否使用 UITableViewCellUIPickerview 子视图? 不,一个简单的 UIView。这应该不是问题,因为可以将重用的视图与 UILabel 一起使用。即使使用 UILabel,它也不起作用 如果你有行,为什么不将UITableView 与自定义单元格一起使用? 因为我不想要 tableView 而是 UIPickerView ...因为当我需要在列表中选择一个项目时 UIPickerView 是合适的组件。 哦,所以你想重用你在UIPickerView中使用的UILabels 【参考方案1】:

我已将我的问题报告给 Apple 技术支持。他们确认了这个错误:

iOS 6 和 7 中的行为似乎确实有所不同。

他们要求我报告错误报告工具上的错误。现在,只需等待修复:)

【讨论】:

我不同意该错误已修复。我看不到 iOS 7 或 iOS 7.1 或 iOS 8 中已修复此错误的迹象。我将再次提交该错误。 正确的@QLag,但这不是tableView:cellForRowAtIndexPath:。它根本不是表格视图。这是pickerView:viewForRow:forComponent:reusingView: 运行我的downloadable example here,你会看到没有标签被重复使用:事实上,当你上下滚动时,我们会创建成百上千个标签,即使选择器视图只有五十行. 好吧,你可以在 7、7.1 或 8 上运行我的 example,你会发现我们从不重复使用任何标签。 在iOS 9中似乎仍然存在该错误。已提交雷达:openradar.appspot.com/radar?id=5546826446929920

以上是关于在 iOS 7 中重用 UIPickerView 中的视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS 7中更改UIPickerView中的文本字体?

如何在iOS 7下更改UIPickerView中文本的颜色?

UIPickerView 在 iOS 7 中不显示数据

ios 7 中带有一个组件的自定义 UIPickerView

PhoneGap:iOS 7 中的 UIPickerView 不会像在 iOS 6 中那样自动调整字体大小。关于如何在 iOS 7 中实现的任何解决方案?

UIPickerVIew viewForRow 中的重用视图:丢失其子视图?