Ios5 在目标C中将标签和文本字段添加到Outlet集合的顺序

Ios5 在目标C中将标签和文本字段添加到Outlet集合的顺序,ios5,Ios5,我正在尝试为iPhone创建一个简单的翻译程序,并在xcode中使用Interface Builder绘制了5个标签和5个文本字段。我已将问题添加到UILabels的outlet集合中,并将答案添加到UITextView的outlet集合中。这部分都很好,我可以列举这些集合,并得到标签和答案的列表。我的问题是我希望得到的是: 索引问题#答案# 1 1 1 2 2 2 3

我正在尝试为iPhone创建一个简单的翻译程序,并在xcode中使用Interface Builder绘制了5个标签和5个文本字段。我已将问题添加到UILabels的outlet集合中,并将答案添加到UITextView的outlet集合中。这部分都很好,我可以列举这些集合,并得到标签和答案的列表。我的问题是我希望得到的是:

索引问题#答案# 1 1 1 2 2 2 3 3 3 以有序的顺序,我得到:

1 1 2 2 3 1 3 2 3
每次我编辑和重新编译程序时,它都是不同的。如何将门店集合中的标签列表与文本视图同步,以便我可以对其进行枚举,以检查是否为问题提供了正确答案?

有几种方法可以将标签与文本视图进行匹配。一个简单的方法是使用标签

每个
ui视图
都有一个整数
标记
属性,您可以随意使用它。您可以在代码中设置标记,也可以在nib的属性检查器的视图部分中设置标记。您还可以使用
viewWithTag:
方法,要求视图搜索其所有子体(包括自身)以查找具有特定标记的视图,但我们不使用该方法

这是你要做的。在笔尖中,给每个标签一个不同的标签。假设给标签A一个标签1,给标签B一个标签2,依此类推。为每个文本视图指定与相应标签相同的标记。所以标签A的文本视图也会得到标签1,标签B的文本视图也会得到标签2,依此类推

然后,在您的
viewDidLoad
方法中,您只需按标记对outlet集合进行排序。假设标签位于名为
labels
的门店集合中,文本视图位于名为
textview
的门店集合中。以下是您如何对它们进行排序:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSComparator compareTags = ^(id a, id b) {
        NSInteger aTag = [a tag];
        NSInteger bTag = [b tag];
        return aTag < bTag ? NSOrderedDescending
            : aTag > bTag ? NSOrderedAscending
            : NSOrderedSame;
    };
    self.labels = [self.labels sortedArrayUsingComparator:compareTags];
    self.textViews = [self.textViews sortedArrayUsingComparator:compareTags];
}
-(void)viewDidLoad{
[超级视图下载];
NSComparator compareTags=^(id a,id b){
NSInteger aTag=[a标记];
NSInteger bTag=[b标签];
返回aTagbTag?传感器解除扫描
:下载名称;
};
self.labels=[self.labels sortedarrayingcomparator:compareTags];
self.textViews=[self.textViews SortedArray使用Comparator:compareTags];
}

现在,
标签
数组和
文本视图
数组被匹配,因此
标签
的索引0处的标签与
文本视图
的索引0处的文本视图相匹配,依此类推。

我尝试使用IBOutletCollection。我发现集合中元素的顺序是按照您将IBOutet元素链接到集合的顺序排列的。

与上面的答案相同,只是针对Swift 3语法进行了更新:

let comparator: ((UIView, UIView) -> Bool) = {
  (left: UIView, right: UIView) in
  return left.tag < right.tag
}
labels.sort(by: comparator)
textViews.sort(by: comparator)
let比较器:((UIView,UIView)->Bool)={
(左:UIView,右:UIView)中
返回left.tag
Hi rob感谢它的工作提示,必须对返回值进行一次更改,请参见下面的内容:NSComparator compareTags=^(id a,id b){if([a标记]>[b标记]){return(NSComparisonResult)sensorderedescending;}if([a标记]<[b标记]){return(NSComparisonResult)sensorderedscensing;}return(NSComparisonResult)sensorderedname;}@罗布-谢谢你!你的代码很有魅力。如果我早几个小时读到这篇文章,我的头发就会完好无损。