我正在使用IBOutletCollections对几个类似UI元素的实例进行分组.特别是,我将一些UIButton(类似于智力竞赛中的蜂鸣器)和一组UILabel(显示分数)分组.我想确保按钮正上方的标签更新分数.我认为通过索引访问它们是最容易的.不幸的是,即使我以相同的顺序添加它们,它们的索引也并不总是相同的.Interface Builder中是否有设置正确顺序的方法.
我正在使用IBOutletCollections对几个类似UI元素的实例进行分组.特别是,我将一些UIButton(类似于智力竞赛中的蜂鸣器)和一组UILabel(显示分数)分组.我想确保按钮正上方的标签更新分数.我认为通过索引访问它们是最容易的.不幸的是,即使我以相同的顺序添加它们,它们的索引也并不总是相同的.Interface Builder中是否有设置正确顺序的方法.
编辑:一些 comments 人士声称,Xcode的最新版本按照连接顺序返回IBOutletCollections
.其他人则声称,这种方法在情节提要中不适用于他们.我自己还没有测试过这个,但是如果你愿意依赖未记录的行为,那么你可能会发现我下面建议的显式排序不再是必要的.
不幸的是,似乎没有任何方法可以控制IB中IBOutletCollection
的顺序,因此需要在加载数组后根据视图的某些属性对其进行排序.您可以根据tag
属性对视图进行排序,但在IB中手动设置标记可能会非常繁琐.
幸运的是,我们倾向于按照访问视图的顺序排列视图,因此通常根据x或y位置对数组进行排序就足够了,如下所示:
- (void)viewDidLoad
{
[super viewDidLoad];
// Order the labels based on their y position
self.labelsArray = [self.labelsArray sortedArrayUsingComparator:^NSComparisonResult(UILabel *label1, UILabel *label2) {
CGFloat label1Top = CGRectGetMinY(label1.frame);
CGFloat label2Top = CGRectGetMinY(label2.frame);
return [@(label1Top) compare:@(label2Top)];
}];
}