31

NSArray を使用した IBOutletCollection に関して、矛盾する 2 つの情報源があります。最初は、インターフェイスからアウトレット コレクションにリンクする順序が重要であり、アウトレット コレクションでは常に同じであると述べています。たとえば、最初のテキスト フィールドを最初にコレクションにリンクすると、要素番号 0 がそのフィールドになります。

しかし、別のソースによると、これは間違っており、実際にはアウトレット コレクションはランダム化されており、物事の順序にはまったく保証がありません。したがって、要素番号 0 は、インターフェースで最初に接続されたものだけでなく、任意のテキスト フィールドにすることができます。

「iOS 6 プログラミング - iOS SDK の探索」が最初のソースで、iTunes のスタンフォード コースが 2 番目のソースです。誰が正しいですか?

4

4 に答える 4

19

どちらの情報源もある程度正しいです。一方で、Interface Builder の実装の詳細により、アイテムを追加する順序がIBOutletCollection取得時に維持されます。一方、この順序を確認する方法がないため、コード内でその順序を使用することは避ける必要があります。

誰かのプロジェクトを引き継ぐことを想像してみてください。に対するループが見られ、IBOutletCollection反復の順序が重要であることを確認し、その順序を確認するか、新しい順序を強制することにした場合は、コントロールを削除してアウトレット コレクションに再度追加する必要があります。IBOutletCollectionそのため、要素を順序付けされていないものとして扱う必要があります。特定の順序を維持する必要がある場合は、要素を にコピーし、NSArray既知のプロパティで並べ替えてから、コピーしたコレクションを繰り返します。

于 2013-03-03T19:44:25.543 に答える
6

Xcode 7.x では IBOutlet コレクションが注文されているようです。

確かに、必要な順序でコレクション内のすべての要素にタグプロパティを割り当てて、次のようなことを行うことができます

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.outletCollection = [self.outletCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]];
}
于 2016-08-26T16:26:19.780 に答える
2

Xcode 7.2 では、IBOutlet コレクションは、接続が確立された順序で並べられます。iOS 8.2 および 9.2 で Swift を使用してテストしました。

于 2016-02-01T11:35:13.573 に答える