2013-03-03 18 views
15

NSArrayを使用したIBOutletCollectionに関する2つの矛盾するソースがあります。 まず、インターフェイスからアウトレットへのコレクションの順序は重要であり、コンセントのコレクションでは常に同じであると言います。例えば。最初のテキストフィールドをコレクションに最初にリンクすると、要素番号0はそのフィールドなどになります。IBOutletCollectionは正しい順序であることが保証されていますか?

しかし、別の情報源は、これが間違っていることを示しています。実際にはアウトレットコレクションはランダム化されています。 。したがって、要素番号ゼロは、インターフェイスで最初に接続されたものだけでなく、任意のテキストフィールドにすることができます。

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

答えて

9

両方のソースが正しいです:一方で、Interface Builderの実装の詳細のために、IBOutletCollectionに項目を追加する順序は検索時に維持されます。一方、この順序をチェックする方法がないため、コード内でその順序を使用しないようにする必要があります。

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

+0

ような何かを行うことができます。 Paul Hegarty以来(少なくとも最新のiOS 7コースではhttps://itunes.apple.com/us/course/developing-ios-7-apps-for/id733644550?affId=1736887 3. Objective-Cクラス時間 - 47 :50)は命令がないと言った。彼はあなたがそれに依存すべきではないと主張しなかった、彼は指定された順序がないと言った:)。 –

+2

@bluesm「順序なし」のようなものはありません。シーケンスがある場合は、*何らかの順序があります。それは任意かもしれませんが、あなたが何かを列挙することができれば、何かが命令を持っています。シーケンスに順序がないと言うときは、シーケンスに*特定の*順序がないことを意味します。 – dasblinkenlight

+0

はい。私はPaul Hegartyが「注文はOutletコレクションにビューをドラッグする順序で指定されていません」と述べました。どちらが間違っている。 –

2

Xcode 7.2では、IBOutletコレクションは接続が確立された途中で順序付けられています。私はiOS 8.2と9.2でSwiftを使ってテストしました。

2

Xcode 7.xのようです。IBOutletコレクションが注文されています。確かに

、あなたはこれがスタンフォードコースが間違っていることを意味必要なために、コレクション内のすべての要素にタグプロパティを割り当て、

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.outletCollection = [self.outletCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]]; 
} 
+1

Swiftでは、「outletCollection = outletCollection.sorted {$ 0.tag <$ 1.tag}」または「outletCollection.sort {$ 0.tag <$ 1.タグ}」を使用できます。 –

関連する問題