objective-c - IBOutletCollection 在 Interface Builder 中设置排序

标签 objective-c ios xcode interface-builder iboutlet

我正在使用 IBOutletCollections 对相似 UI 元素的多个实例进行分组。特别是,我将一些 UIButtons(类似于问答游戏中的蜂鸣器)和一组 UILabels(显示分数)分组。我想确保按钮正上方的标签更新乐谱。我认为通过索引访问它们是最简单的。不幸的是,即使我以相同的顺序添加它们,它们也不总是具有相同的索引。 Interface Builder 中是否有设置正确顺序的方法。

最佳答案

编辑:一些评论者声称 Xcode 的较新版本按连接建立的顺序返回 IBOutletCollections。其他人声称这种方法在 Storyboard中对他们不起作用。我自己还没有对此进行测试,但如果您愿意依赖未记录的行为,那么您可能会发现不再需要我在下面建议的显式排序。


不幸的是,似乎没有任何方法可以控制 IB 中 IBOutletCollection 的顺序,因此您需要在加载数组后根据 View 的某些属性对其进行排序.您可以根据它们的 tag 属性对 View 进行排序,但是在 IB 中手动设置标签可能相当乏味。

幸运的是,我们倾向于按照我们想要访问它们的顺序来布置我们的 View ,因此通常根据 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 - IBOutletCollection 在 Interface Builder 中设置排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112739/

相关文章:

ios - 如何关闭 UIPopoverController 并选择一个表格单元格?

ios - 生产证书缺失

ios - NSInputStream 没有收到所有数据

ios - 如何使用静态变量在 objective-c 中保存字符串?

ios - 如何在不使用 SpriteKit 中的 Action 的情况下更改节点的位置?

ios - Xcode和iOS版本匹配有什么意义?

Xcode 6 在提交存档时崩溃

objective-c - NSNumberFormatter Currency Style 没有小数位的数字格式

ios - 向服务器发送简单的 POST 消息

ios - 创建动画时,为什么要向 UIView 类属性发送消息?