我正在使用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)];
    }];
}

Objective-c相关问答推荐

将 NSMutableAttributedString 转换为 NSString

iOS - 如何预加载键盘?

如何测试 NSCFBolean 值?

如何创建圆形按钮?

自构建预编译头后文件已被修改

在 10.9 上以编程方式启用对辅助设备的访问

处理 ARC 中的指针对指针所有权问题

iOS 编译错误:CDVCommandDelegateImpl没有可见的@interface 声明 Select 器执行:

NSManagedObjectContext performBlockAndWait:不在后台线程上执行?

lldb 无法打印变量值并显示错误:对 'id' 的引用不明确

Select 时如何更改 UITableViewCell 的 colored颜色 ?

未找到 RKObjectMapping.h

自定义 UISwitch 和 App Store 批准

xcode storyboard Container View - 如何访问视图控制器

Select 时 UITableViewCell 复选标记更改

Xcode 7 UI 测试:如何在代码中消除一系列系统alert

强制iOS应用程序崩溃的最快方法是什么?

允许用户从 UILabel 中 Select 文本进行复制

如何阻止 NSNotification 中的观察者调用两次?

Xcode 如何加载主情节提要?