8

Ho una sottoclasse di UICollectionViewCell. La cella è progettata visivamente nello storyboard con molti componenti e questi componenti sono legati alle variabili nella sottoclasse Swift utilizzando lo storyboard.Come ripristinare i binding in UICollectionViewCell dopo la decodifica

La classe Swift fornisce solo la logica per il popolamento dei componenti dai dati recuperati dall'origine dati.

Ad esempio:

class InfoCollectionViewCell : UICollectionViewCell { 

    @IBOutlet weak var mainPanel : UIView! 
    @IBOutlet weak var panel1 : UIView! 

    @IBOutlet weak var firstName : UILabel! 
    @IBOutlet weak var lastName : UILabel! 
    @IBOutlet weak var address : UILabel! 
    etc ... 

    func setVariousProperties(etc) { 
     firstName.text = ... etc 

I dati-source fa la solita cosa:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
if let c : InfoCollectionViewCell = cell as? InfoCollectionViewCell { 
    c.setVariousProperties(...) 
} 

decodifico origine solo implementato/metodi di codifica che contengono un'affermazione "non implementato", ma è diventato apparente che occasionalmente il framework stava codificando e decodificando la classe. Ho implementato i metodi fittizi di codifica/decodifica senza salvare i componenti, causando problemi prevedibili con valori nulli quando i componenti sono stati acceduti.

Quindi sembra che sia necessario implementare la codifica e la decodifica di tutti i controlli nella sottoclasse UICollectionViewCell uno alla volta o devo trovare un modo migliore.

Sembra uno spreco di tempo in quanto non ho effettivamente bisogno (non credo) di salvare il contenuto dei componenti poiché saranno solo per essere riutilizzati comunque dalla sottoclasse: sovrascriverò il contenuto del componente valuterà dall'origine dati.

Ovviamente, tutti i controlli sono definiti nello storyboard. Potrei recuperarli manualmente per nome dallo storyboard nel metodo init, ma ciò sembra altrettanto noioso e rende ridondante il collegamento grafico dei controlli e delle variabili.

C'è un modo migliore?

Posso solo dire "ripristinare le connessioni" o qualcosa del genere?

EDIT:

Da qualche parte tra la pubblicazione della domanda e aggiungendo la generosità, il problema si fermò accadendo. Ora noto che il metodo di codifica dei miei componenti non viene chiamato. Quindi, per qualche ragione, la struttura stava decidendo di serializzare i miei oggetti e deserializzarli, ma ora non lo è. Quindi il problema non si verifica e non sono in grado di fornire una traccia di stack.

È possibile che qualche aggiornamento a XCode abbia risolto questo problema o potrebbe essere qualcos'altro.

Sono ovviamente ancora preoccupato che ci sia qualche bug in agguato da qualche parte.

+0

Chiunque altro abbia questo problema? Apprezzerei i commenti. – rghome

risposta

2

Non è necessario implementare la codifica/decodifica per nessuno dei controlli che sono stati disposti e collegati nello Storyboard. Questo sarà risolto in fase di runtime e si otterrà una cella dopo il collectionView.dequeueReusableCellWithReuseIdentifier finché tutto il resto è stato collegato correttamente con i componenti dell'interfaccia utente pronti per l'uso.Le cose da controllare sono:

  1. La sottoclasse è specificato nella sezione storyboard classe personalizzata
  2. Il reuseIdentifier è definito in modo da corrispondere alla stringa che ci si aspetta
  3. Tutte le IBOutlets sono collegati e devono anche mostrare i collegamenti in il codice accanto alle linee var IBOutlet.

Una volta che avete assicurato questi sono giusto provare a stampare i componenti per verificare se sono ancora pari a zero e l'immissione del testo semplice in là per eliminare eventuali problemi dataSource:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
    if let c = cell as? InfoCollectionViewCell{ 
     print(c.address) 
     print(c.firstName) 
     print(c.lastName) 

     c.firstName.text = "firstName Test" 
     c.lastName.text = "lastName Test" 
     c.address.text = "address Test" 
    } 
    return cell 
    } 
} 
+0

OK - grazie. Farò un po 'più di indagine. – rghome

+0

Naturalmente, non posso riprodurlo ora. Era un problema che era abbastanza facilmente riproducibile su una vista con 100 celle quando veniva eseguita una pergamena, ma non su viste con meno celle e non sulla prima schermata mostrata. Presumo che qualcosa abbia attivato la serializzazione delle celle. Ora mi dà fastidio che ci sia un bug intermittente lì, poiché tutti i suggerimenti che hai fatto devono essere stati applicati comunque, altrimenti non avrei avuto il primo schermo di celle funzionanti. Gli errori che ho ricevuto mostravano chiaramente che init (coder) veniva chiamato e chiaramente che gli IBOutlet non venivano cablati dopo la decodifica. – rghome

+0

Mi piacerebbe che fosse la risposta giusta. Non sono solo convinto che lo sia. Come ho detto sopra, le chiamate di codifica/decodifica hanno smesso di accadere per ragioni sconosciute. Anche se si trattava di un bug in alcune versioni di IOS (o nel simulatore), non posso essere sicuro che sia stato corretto su tutti i dispositivi. Sembra che la strategia migliore sia quella di giocare sul sicuro e implementare la decodifica e la codifica per tutti i componenti. – rghome