¿Por qué la salida de UICollectionViewCell es nula?

143

He creado una UICollectionViewCell personalizada en el Creador de interfaces, las vistas vinculadas a la clase, y luego, cuando quiero usar y establecer una cadena en la etiqueta de la cadena, la etiqueta tiene un valor nulo.

override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes
    self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
}

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {

    var cell: LeftMenuCollectionViewCell
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("ls", forIndexPath: indexPath) as LeftMenuCollectionViewCell
    println(cell.label) // <- this is nil, why??
    cell.label.text = "asd"

    return cell
}

Y la celda subclaseada:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}
János
fuente
¿Hay alguna razón por la que estás usando el "!" Explícito Además de escribir nombres en todas partes? Parece redundante, especialmente en los IBOutlets. El único lugar que podría importar es donde eliminas la celda como LeftmenuCollectionViewCell, pero no lo haces allí. ¿Puedes imprimir la celda 'NSLog'?
mc01
1
Si elimino "!" o usar "?" en la definición de clase, me sale un error del compilador o se bloquea. "!" es el valor predeterminado cuando lo vincula.
János
hormiga la celda en sí: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; marco = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
János
¿Todos los enchufes conectados en IB? ¿Funcionan los otros puntos de venta? No veo ningún otro problema obvio, lo siento.
mc01

Respuestas:

310

Estoy llamando de self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")nuevo. Si está utilizando un guión gráfico, no desea llamar a esto . Sobreescribirá lo que tienes en tu guión gráfico.

Si todavía tiene el cheque problema carnero reuseIdentifieres igual en dequeueReusableCellWithReuseIdentifier y en storyboard.

János
fuente
18
¡Gracias! Pasé más de una hora en esto, ya que estaba usando una celda personalizada.
DogCoffee
tengo el mismo problema pero nunca usé esta línea de código, ¿tienes alguna idea de por qué recibo la misma excepción?
Dekel Maman
Gracias. Esto lo resolvió para mí. Tenía un guión gráfico y agregué manualmente un controlador de vista. el código repetitivo incluía la línea que mencionaste. a pesar de que parecía correcto (identificador y clase correctos) se negó a conectar las salidas. ahora funciona. ¡dulce!
Joris Weimar
13
Si está utilizando un guión gráfico, no desea llamar a esto. Sobreescribirá lo que tienes en tu guión gráfico. <- Este realmente me
ayudó
66
¡GAH, qué cosa tan horrible tener en la plantilla UICollectionViewController! Gracias Janos.
Kenny Wyland
53

Simplemente elimine esta línea:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
能 蟹 仔
fuente
3
No entiendo por qué esto fue rechazado. Esta fue la respuesta a mi problema.
Félix Simões
1
Esta es la respuesta correcta y la persona que hizo la pregunta debe marcarla en consecuencia. También sería genial entender por qué funciona :)
Kiko Lobo
3
Supongo que fue rechazado porque la pregunta fue respondida en agosto del 14 ... mientras que esta respuesta solo copia la respuesta aquí, después de varios meses.
Nitin Nain
1
Pero cuando no lo uso, me da error Error de aserción en - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera
Una explicación de por qué esta línea no es necesaria sería bienvenida. Actualmente está agregado por la plantilla de Xcode para una nueva vista de colección.
pkamb
47

Si está utilizando xib, asegúrese de haber agregado esta línea de código a su viewdidload.

C objetivo:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

Rápido:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")
Vineeth
fuente
¿tiene que registrar tanto la clase como la punta, o solo la punta es suficiente?
RainCast
3
Acabo de registrar la punta y resolvió mis problemas.
Amelia
Parece que hay dos formas de registrarme y estaba usando la incorrecta ... collectionView? .Register (UINib (nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
Sergio
17

Tengo que registrar esa punta chicos!

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCellId")
Miguel
fuente
6

Parece que hay dos formas de registrarme y estaba usando la incorrecta la primera. Tengo una vista xib personalizada, así que registrada con la segunda opción, ¡y tenemos datos!

1:

collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") 

2:

collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")
Sergio
fuente
0

Tuve un problema similar, pero mi error fue que no delegué CollectionViewCell para poder cambiar el texto de la etiqueta.

justRadojko
fuente
0

Creo que la mejor solución es usar directamente del guión gráfico donde agregar un CollectionView, como alternativa, debe eliminar un CollectionViewCellde su CollectionViewguión gráfico y registrar una celda con el siguiente comando:

collectionView? .register (UINib (nibName: "YourItemClassName", paquete: nil), forCellWithReuseIdentifier: "yourIdentifier")

dgalluccio
fuente