两个UIPickerView对象可以共享相同的数据源数组吗?

时间:2011-08-31 02:56:15

标签: ios objective-c arrays uipickerview

我在Xcode 4.02中使用Interface Builder在View中添加了两个UIPickerViews。它们连接到同一个委托和数据源(UIViewController)。在我的.h文件中,我也声明了UIPickerViews并将它们作为参考出口连接起来,就像许多例子一样。 在viewForRow中,我使用UILabels的相同NSMutable数据数组来返回适当的值(此数组在viewDidLoad中填充)。

但是,我发现两个UIPickerViews同时没有出现Label。例如,当应用程序启动时,每个UIPickerView应显示元素0,1和2.对于每个UIPickerView,调用viewForRow 3次,但只调用viewForRow的视图将显示前3行。另一个UIPickerView是空白的。如果我将第一个视图向下滚动到第6个元素然后再回到第一个视图,那么视图将显示前3个元素,但第二个视图(显示前3行的视图)现在什么也没有显示。具体来说,两个UIPickerViews中不会同时出现数据数组元素。

这是预期的吗?每个UIPickerView是否都有自己的支持阵列 - 如果你正在使用它们?是不是所有这些返回的视图都只是指针?就好像每个数组元素只能在任何时候最多显示(指向)一次。

如果我使用两个单独的数据阵列,那么似乎没有问题。但它确实意味着额外的内存和额外的编码。

注意:在viewForRow中,我有代码来设置标签的大小:

    UILabel *xx = (UILabel *)[self.array1 objectAtIndex:row];        
    CGSize rowSize = [thePickerView rowSizeForComponent:component];
    CGRect labelRect = CGRectMake (0, 0, rowSize.width, rowSize.height);
    [xx setFrame:labelRect];

即使该行稍后显示为空白,此处设置的值也不会更改。

1 个答案:

答案 0 :(得分:0)

多个选择器视图可以共享相同的数据源,但视图(在这种情况下为UILabel)只能有一个超级视图。

你不能在两个选择器中使用相同的标签,并且可能没有理由将它们存储在你自己的数组中。更好的方法是在viewForRow方法中创建单独的标签,并且只有一个包含标签内容的数组(例如NSString)。

在当前的实现中,当您返回标签时,选择器会将其添加到自己的视图层次结构中,该层次结构隐式地将其从之前的任何视图(您的其他选择器)中删除。