2013-03-03 11 views
15

NSArray ile IBOutletCollection ile ilgili iki çelişkili kaynağım var. Öncelikle, arabirimden çıkış koleksiyonuna bağlantı verdiğiniz siparişin önemli olduğunu ve çıkış koleksiyonunda her zaman aynı olacağını söylüyor. Örneğin. İlk metin alanını ilk olarak koleksiyona bağlarsak, 0 numaralı eleman bu alan olacaktır.IBOutletCollection'ın doğru sırada olması garanti edilir mü?

Ama başka bir kaynak bana bunun yanlış olduğunu ve aslında Outlet koleksiyonunun rastgele olduğunu ve şeylerin sırasına göre kesinlikle bir garanti olmadığını söyler. . Yani, eleman numarası sıfır, sadece arabirime bağlanan ilk değil, herhangi bir metin alanı olabilir.

"iOS 6 Programlama - iOS SDK'yı keşfetme" ilk kaynaktır ve iTunes'daki Stanford kursu ikinci kaynaktır. Kim haklı?

cevap

9

Her iki kaynak da bir tür haklıdır: bir yandan, Arayüz Oluşturucu'nun uygulama ayrıntıları nedeniyle, IBOutletCollection numaralı öğeye öğelerin eklenme sırası, geri alma sırasında korunacaktır; Diğer taraftan, kodunuzda bu siparişi kullanmaktan kaçınmalısınız, çünkü bu siparişi kontrol etmenin bir yolu yoktur.

Başka birinin projesini ele geçirmeyi düşünün. Bir IBOutletCollection üzerinde bir döngü görürseniz, yineleme sırasının önemli olduğunu gözlemleyin ve bu siparişin ne olduğunu kontrol etmeyi veya yeni siparişi zorlamaya karar verdiğinizde, denetimleri çıkarmanız ve çıkış koleksiyonunuza yeniden eklemeniz gerekir. Bu nedenle, IBOutletCollection öğelerinizi sırasız olarak ele almalısınız. Belirli bir siparişi sürdürmek gerekiyorsa, öğeleri NSArray'a kopyalayın, bunları bilinen bazı özelliklere göre sıralayın ve sonra kopyalanan koleksiyonu yineleyin.

+0

böyle bir şey yapmak. Paul Hegarty'den (En azından en son iOS 7 dersinde https://itunes.apple.com/us/course/developing-ios-7-apps-for/id733644550?affId=1736887 3.Objective-C sınıfı süre - 47 : 50) emir olmadığını söyledi. Ona bağlı olmamam gerektiğini iddia etmedi, belli bir emir olmadığını söyledi :). –

+2

@bluesm "Düzen yok" diye bir şey yoktur: Bir dizinin olduğu yerde, * bazı * düzenleri vardır. Rastgele olabilir, ama bir şeyi numaralandırabiliyorsanız, bir şeyin bir emri vardır. Bir dizinin bir düzeninin olmadığını söylediğinde, dizinin * özel * sırasının olmadığı anlamına gelir. – dasblinkenlight

+0

Evet. Paul Hegarty'nin "Sipariş, görünümleri Outlet koleksiyonuna sürüklediğiniz sırayla belirtilmiyor" demişti. Hangisi yanlış. –

2

Xcode 7.2'de IBOutlet koleksiyonu, bağlantılar yapıldıkça sırayla sipariş edilir. IOS 8.2 ve 9.2'de Swift'i kullanarak test ettim.

2

Xcode 7'de göründüğü gibi IBOutlet koleksiyonu sipariş edilir.

Bu Stanford Ders yanlış olduğu anlamına gelir herhalde, size ihtiyaç sırayla koleksiyonunda her elemana etiketini özelliğini atayabilir ve

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

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

Swift'de "outletCollection = outletCollection.sorted {$ 0.tag <$ 1.tag}" veya "outletCollection.sort {$ 0.tag <$ 1.tag}" öğesini kullanabilirsiniz. –

İlgili konular