【问题标题】:Can two UIPickerView objects share the same datasource array?两个 UIPickerView 对象可以共享同一个数据源数组吗?
【发布时间】: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];

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

【问题讨论】:

    标签: ios objective-c arrays uipickerview


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多