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

Posted

技术标签:

【中文标题】两个 UIPickerView 对象可以共享同一个数据源数组吗?【英文标题】:Can two UIPickerView objects share the same datasource array? 【发布时间】:2011-08-31 02:56:14 【问题描述】:

我在 Xcode 4.02 中使用 Interface Builder 在一个视图中添加了两个 UIPickerView。它们连接到相同的委托和数据源(UIViewController)。在我的 .h 文件中,我还声明了 UIPickerViews 并将它们连接为参考插座,就像在许多示例中一样。 在 viewForRow 中,我使用 UILabel 的相同 NSMutable 数据数组来返回适当的值(该数组填充在 viewDidLoad 中)。

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

这是预期的吗?每个 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】:

多个选择器视图可以共享同一个数据源,但一个视图(在本例中为UILabel)只能有一个超级视图。

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

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

【讨论】:

以上是关于两个 UIPickerView 对象可以共享同一个数据源数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法在同一个控制器中使用两个 UIPickerView

带有属性字符串的 UIPickerView

滚动使用 IB 设置的 UIPickerView 时崩溃

如何使用情节提要约束将两个 UIPickerView 并排均匀分布?

UIPickerView 依赖于 UITableView

两个托管对象上下文可以共享一个持久存储协调器吗?