Cómo restaurar los enlaces en UICollectionViewCell después de que se decodifica

Tengo una subclass de UICollectionViewCell . La celda está diseñada visualmente en el guión gráfico con muchos componentes y estos componentes están vinculados a las variables en la subclass Swift usando el guión gráfico.

La class Swift simplemente proporciona lógica para poblar los componentes a partir de los datos recuperados de la fuente de datos.

Por ejemplo:

 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 

La fuente de datos hace lo habitual:

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

Originalmente, solo implementé methods de deencoding / encoding que contenían una aserción "no implementada", pero se hizo evidente que ocasionalmente el marco codificaba y decodificaba la class. Implementé methods ficticios de encoding / deencoding sin save los componentes, lo que resultó en problemas pnetworkingecibles con valores nil cuando se accedió a los componentes.

Por lo tanto, parece que estoy obligado a implementar la encoding y deencoding de todos los controles en la subclass UICollectionViewCell uno por uno, o debo encontrar una mejor manera.

Parece una pérdida de time, ya que en realidad no necesito (no creo) save los contenidos de los componentes, ya que de todas forms van a ser reutilizados por la subclass: sobrescribiré los contenidos del componente valores de la fuente de datos.

Obviamente, todos los controles se definen en el guión gráfico. Podría searchlos manualmente por el nombre del guión gráfico en el método init, pero eso parece igualmente tedioso y hace que la vinculación gráfica de los controles y las variables sean networkingundantes.

¿Hay una mejor manera?

¿Puedo decir "restaurar conexiones" o algo así?

EDITAR:

En algún lugar entre la publicación de la pregunta y la adición de la recompensa, el problema dejó de suceder. Ahora me doy count de que el método de encoding de mis componentes no recibe llamadas. Entonces, por alguna razón, el marco estaba decidiendo serializar mis objects y deserializarlos, pero ahora no lo es. Por lo tanto, el problema no está ocurriendo y no puedo proporcionar un rastreo de stack.

Es concebible que alguna actualización de XCode haya solucionado este problema, o podría ser otra cosa.

Obviamente, todavía me preocupa que haya algún error al acecho en alguna parte.

No debería necesitar implementar la encoding / deencoding para ninguno de los controles que se han establecido y conectado en el Storyboard. Esto se solucionará en time de ejecución y obtendrá una celda después de la collectionView.dequeueReusableCellWithReuseIdentifier View.dequeueReusableCellWithReuseIdentifier, siempre que todo lo demás se haya conectado correctamente con los componentes de la interfaz de usuario listos para usar. Las cosas para verificar son:

  1. La subclass se especifica en la sección de class personalizada de storyboard
  2. El reuseIdentifier se define para que coincida con la cadena que espera
  3. Todos los IBOutlets están conectados y también deben mostrar las conexiones en el código siguiente a las líneas IBOutlet var.

Una vez que se haya asegurado de que son correctos, intente imprimir los componentes para verificar si todavía son nulos y para colocar algún text simple allí para eliminar cualquier problema de 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 } }