2013-03-03 13 views
15

Ho due fonti contraddittorie riguardo a IBOutletCollection con NSArray. Prima dice che l'ordine con cui si collegano le cose dall'interfaccia alla collezione outlet è significativo, e sarà sempre lo stesso nella collezione outlet. Per esempio. se colleghiamo il primo campo di testo prima alla raccolta, l'elemento numero 0 sarà quel campo, ecc.IBOutletCollection garantisce un ordine corretto?

Ma un'altra fonte mi dice che questo è sbagliato e in realtà la collezione Outlet è casuale e non c'è assolutamente alcuna garanzia nell'ordine delle cose . Quindi l'elemento numero zero può essere qualsiasi campo di testo, e non solo il primo connesso nell'interfaccia.

"Programmazione iOS 6: esplorazione di iOS SDK" è la prima fonte e il corso di Stanford su iTunes è la seconda fonte. Chi ha ragione?

risposta

9

Entrambe le fonti sono corrette: da una parte, a causa dei dettagli di implementazione di Interface Builder, l'ordine con cui si aggiungono gli articoli a IBOutletCollection verrà mantenuto in fase di recupero; d'altra parte, dovresti evitare di usare quell'ordine nel tuo codice, perché non c'è modo di controllare questo ordine.

Immagina di prendere in consegna il progetto di qualcun altro. Se vedi un loop su un IBOutletCollection, osserva che l'ordine di iterazione è importante e decidi di controllare quale sia l'ordine o forzare il nuovo ordine, dovresti rimuovere e riaggiungere i controlli alla tua collezione outlet. Questo è il motivo per cui dovresti trattare gli elementi IBOutletCollection come non ordinati. Se è necessario mantenere un ordine specifico, copiare gli elementi in un NSArray, ordinarli su una proprietà nota e quindi iterare la raccolta copiata.

+0

Ciò significa che Stanford Course è sbagliato. Da Paul Hegarty (Almeno sull'ultimo corso iOS 7 https://itunes.apple.com/us/course/developing-ios-7-apps-for/id733644550?affId=1736887 3.Objective-C time time - 47 : 50) ha detto che non c'è ordine. Non ha sostenuto che non dovresti dipendere da questo, ha detto che non esiste un ordine specifico :). –

+2

@bluesm Non c'è niente come "nessun ordine": dove c'è una sequenza, c'è * qualche * ordine. Può essere arbitrario, ma se riesci a enumerare qualcosa, quel qualcosa ha un ordine. Quando dicono che una sequenza non ha un ordine, significano che la sequenza non ha un ordine * specifico *. – dasblinkenlight

+0

Sì. Intendevo dire che Paul Hegarty ha dichiarato che "l'ordine non è specificato dall'ordine in cui trascini le visualizzazioni alla collezione Outlet". Che è sbagliato –

2

In Xcode 7.2 La raccolta IBOutlet è ordinata nel modo in cui sono state effettuate le connessioni. L'ho provato usando Swift su iOS 8.2 e 9.2.

2

Sembra che in Xcode 7.x sia ordinata la raccolta IBOutlet.

Di sicuro, è possibile assegnare tag proprietà per ogni elemento di raccolta al fine necessario e fare qualcosa di simile

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

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

In Swift puoi usare "outletCollection = outletCollection.sorted {$ 0.tag <$ 1.tag}" o "outletCollection.sort {$ 0.tag <$ 1.tag}". –

Problemi correlati