2013-03-03 5 views
15

NSArray를 사용하는 IBOutletCollection과 관련하여 두 가지 모순되는 출처가 있습니다. 먼저 인터페이스에서 콘센트 컬렉션으로 연결하는 순서가 중요하며 콘센트 수집시 항상 동일하게 적용됩니다. 예 : 첫 번째 텍스트 필드를 먼저 콜렉션에 연결하면 요소 번호 0이 해당 필드가됩니다.IBOutletCollection은 올바른 순서로 보장됩니까?

그러나 다른 소스는 이것이 잘못된 것으로 실제로 아울렛 컬렉션이 무작위로 표시되며 사물의 순서에 대해 절대적으로 보장이 없음을 나타냅니다. . 따라서 요소 번호 0은 인터페이스에 연결된 첫 번째 텍스트 필드가 아닌 모든 텍스트 필드가 될 수 있습니다.

"iOS 6 프로그래밍 - iOS SDK 탐색"은 iTunes의 첫 번째 소스이며 Stanford 코스가 두 번째 소스입니다. 누가 맞습니까?

답변

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. 목표 -C 수업 시간 - 47 : 50)는 명령이 없다고 말했다. 그는 당신이 그것에 의지해서는 안된다고 주장하지 않았고, 지정된 순서가 없다고 말했다. :) –

+2

@bluesm "순서 없음"과 같은 것은 없습니다 : 순서가있는 곳에 * 어떤 순서가 있습니다. 그것은 임의적 일지 모르지만, 당신이 뭔가를 열거 할 수 있다면, 그것은 무언가가 질서를 가지고 있음을 나타냅니다. 시퀀스에 순서가 없다고 말하면 시퀀스에 * 특정 * 순서가 없음을 의미합니다. – dasblinkenlight

+0

예. 나는 Paul Hegarty가 "아울렛 컬렉션으로 뷰를 드래그하는 순서에 따라 오더가 지정되지 않았다"고 말했습니다. 어떤 잘못입니다. –

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. 태그 $ 1. 태그}"또는 "outletCollection.sort {$ 0. 태그 $ 1. 태그}"를 사용할 수 있습니다. –

관련 문제