2

我正在尝试在 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。但是,在从头开始设置前几个屏幕视图之后,我被一个(回收的,我假设)非零“reusingView”调用,但它没有任何子视图,所以我崩溃了当试图获取其现有标签来更改它时。

我是不是误会了什么?

4

1 回答 1

2

我无法复制您的问题。我用下面的代码做了一个简单的项目,和你的很相似。我在标签上添加了一个框架,并为背景着色,这样我就可以看到发生了什么。您是否能看到与您所拥有的任何会导致结果不同的差异(可能问题出在您未显示的“...”区域)?

- (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;
}
于 2013-05-16T14:49:53.597 回答