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

时间:2013-03-03 19:35:57

标签: ios ios6

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

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

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

4 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:11)

btnCollection = btnCollection.sorted(by: { $0.tag < $1.tag})

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

答案 2 :(得分:5)

似乎在Xcode 7.x中订购了IBOutlet集合。

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

的操作
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.outletCollection = [self.outletCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]];
}

答案 3 :(得分:2)

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