IBOutletCollection是否保证正确的顺序?

关于NSArray的IBOutletCollection,我有两个矛盾的来源。 首先说的是,从界面到出口收集的链接顺序是非常重要的,在出口收集过程中也是一样的。 例如,如果我们首先将第一个文本字段链接到集合,则元素编号0将是该字段等。

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

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

这两个源都是正确的:一方面,由于Interface Builder的实现细节,将项目添加到IBOutletCollection的顺序将在检索时保留; 另一方面,你应该避免在你的代码中使用这个顺序,因为没有办法检查这个顺序。

想象一下接pipe别人的项目。 如果在IBOutletCollection看到循环,请注意迭代的顺序很重要,并决定检查该订单或强制新订单,则必须删除并重新将控件添加到您的outlet集合中。 这就是为什么你应该把你的IBOutletCollection元素当成无序的。 如果需要维护一个特定的顺序,将元素复制到一个NSArray ,在一些已知属性上对它们进行sorting,然后遍历复制的集合。

在Xcode 7.2中,IBOutlet集合按照连接的方式进行sorting。 我在iOS 8.2和9.2上使用Swift进行了testing。

它看起来像在Xcode 7.x IBOutlet集合是有序的。

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

 - (void)viewDidLoad { [super viewDidLoad]; self.outletCollection = [self.outletCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]]; }