关于使用NSArray的IBOutletCollection,我有两个矛盾的来源。 首先说,您从接口到出口集合链接的顺序是重要的,并且它在出口集合中始终是相同的。例如。如果我们首先将第一个文本字段链接到集合,则元素编号0将是该字段等。
但是另一个消息来源告诉我这是错误的,实际上Outlet集合是随机的,并且绝对不能保证事情的顺序。因此元素编号为零可以是任何文本字段,而不仅仅是在界面中连接的第一个文本字段。
“iOS 6编程 - 探索iOS SDK”是第一个来源,iTunes上的斯坦福课程是第二个来源。 谁是对的?
答案 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测试了它。