31

关于带有 NSArray 的 IBOutletCollection,我有两个相互矛盾的来源。首先说您将事物从接口链接到插座集合的顺序很重要,并且在插座集合中始终相同。例如,如果我们首先将第一个文本字段链接到集合,则元素编号 0 将是该字段,等等。

但是另一个消息来源告诉我这是错误的,实际上 Outlet 集合是随机的,并且绝对不能保证事物的顺序。所以元素编号零可以是任何文本字段,而不仅仅是接口中的第一个连接。

“iOS 6 编程 - 探索 iOS SDK”是第一个来源,iTunes 上的斯坦福课程是第二个来源。谁是对的?

4

4 回答 4

25

只需分配控件的顺序tag并在加载时重新排序它们。


属性观察:

@IBOutlet var btnCollection: [UIButton]! {
    didSet {
        btnCollection.sort { $0.tag < $1.tag }
    }
}

在 viewDidLoad 中:

override func viewDidLoad() {
    super.viewDidLoad()
    btnCollection = btnCollection.sorted { $0.tag < $1.tag }
}
于 2018-05-29T09:30:39.877 回答
19

两种来源都是正确的:一方面,由于 Interface Builder 的实现细节,您添加项目的顺序IBOutletCollection将在检索时保持;另一方面,您应该避免在代码中使用该顺序,因为无法检查此顺序。

想象一下接管别人的项目。如果您在 上看到一个循环IBOutletCollection,请注意迭代的顺序很重要,并决定检查该顺序是什么或强制执行新顺序,您将必须删除控件并将其重新添加到您的插座集合中。这就是为什么你应该将你的IBOutletCollection元素视为无序的。如果需要维护特定的顺序,请将元素复制到 中NSArray,根据某个已知属性对它们进行排序,然后迭代复制的集合。

于 2013-03-03T19:44:25.543 回答
6

似乎在 Xcode 7.x IBOutlet 集合中是有序的。

当然,您可以按需要的顺序将标签属性分配给集合中的每个元素,并执行类似的操作

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.outletCollection = [self.outletCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]];
}
于 2016-08-26T16:26:19.780 回答
2

在 Xcode 7.2 中,IBOutlet 集合按照建立连接的方式排序。我确实在 iOS 8.2 和 9.2 上使用 Swift 对其进行了测试。

于 2016-02-01T11:35:13.573 回答