我试图在UIPickerView中重新使用带有子视图的视图:
- (UIView *)pickerView:(UIPickerView *)pickerView
viewForRow:(NSInteger)row
forComponent:(NSInteger)component
reusingView:(UIView *)view
{
UILabel* label = nil;
if (view == nil) {
view = [[UIView alloc] init];
label = [[UILabel alloc] init];
[view addSubview:label];
}
if (label == nil) {
label = view.subviews[0]; // Exception here because there are no subviews
}
...
如果在输入时设置了“reusingView” UIView,则希望它保留了我添加的子视图(UILabel)(从字面意义上来讲还是从形象上!)。但是,从头开始设置屏幕上的前几个视图后,我被称为(回收的,我认为是)非nil“reusingView”,但是它没有任何子视图,所以我崩溃了尝试获取其现有标签进行更改时。
我误会了吗?
最佳答案
我无法重复您的问题。我使用以下代码创建了一个简单的项目,该代码与您的代码非常相似。我在标签上添加了一个框架,并对背景进行了着色,以便可以看到发生了什么。您是否能看到与结果会有所不同的任何差异(也许问题出在未显示的“...”区域)?
- (void)viewDidLoad {
[super viewDidLoad];
self.picker.dataSource = self;
self.picker.delegate = self;
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return 10;
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
UILabel* label = nil;
if (view == nil) {
view = [[UIView alloc] init];
view.backgroundColor = [UIColor blueColor];
label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 60, 22)];
label.text = @"test";
[view addSubview:label];
}
if (label == nil) {
NSLog(@"%@",view.subviews);
label = view.subviews[0]; // I do get subviews here.
}
return view;
}
关于ios - UIPickerView中的重用 View viewForRow:丢失其 subview ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16590297/