IBOutletCollection是否保证是正确的顺序?

Dvo*_*ole 27 ios ios6

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

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

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

Dar*_*hah 16

btnCollection = btnCollection.sorted(by: { $0.tag < $1.tag})
Run Code Online (Sandbox Code Playgroud)

只需按标签分配控件的顺序,然后在加载时重新排序.

  • 不完全是问题的答案,但确实是一行非常方便的代码,所以无论如何我都赞成它:D (2认同)

das*_*ght 15

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

想象一下接管别人的项目.如果您看到一个循环IBOutletCollection,观察迭代的顺序,并决定检查该订单是什么或强制新订单,您将不得不删除并重新添加控件到您的插座集合.这就是为什么你应该把你的IBOutletCollection元素视为无序的原因.如果需要维护特定的顺序,请将元素复制到a中NSArray,对某些已知属性进行排序,然后迭代复制的集合.

  • @bluesm没有"没有订单"这样的东西:哪里有一个序列,那就是*一些*订单.它可能是任意的,但如果你能枚举一些东西,那东西确实有一个订单.当他们说序列没有顺序时,他们意味着序列没有*特定的*顺序. (3认同)

art*_*ams 6

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

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.outletCollection = [self.outletCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]];
}
Run Code Online (Sandbox Code Playgroud)

  • 在Swift中,您可以使用“ outletCollection = outletCollection.sorted {$ 0.tag &lt;$ 1.tag}”或“ outletCollection.sort {$ 0.tag &lt;$ 1.tag}”。 (5认同)