uitableviewcontroller uitableviewcell tutorial personalizadas custom celdas ios uitableview swift

ios - uitableviewcell - La clase no tiene inicializadores Swift



uitableview tutorial swift 4 (7)

Debe usar opciones implícitamente desenvueltas para que Swift pueda hacer frente a las dependencias circulares (padre <-> hijo de los componentes de la IU en este caso) durante la fase de inicialización.

@IBOutlet var imgBook: UIImageView! @IBOutlet var titleBook: UILabel! @IBOutlet var pageBook: UILabel!

Lea este doc , lo explican todo muy bien.

Tengo un problema con la clase Swift. Tengo un archivo rápido para la clase UITableViewController y la clase UITableViewCell. Mi problema es la clase UITableViewCell y los puntos de venta. Esta clase tiene un error La clase "HomeCell" no tiene inicializadores , y no entiendo este problema.

Gracias por sus respuestas

import Foundation import UIKit class HomeTable: UITableViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet var tableViex: UITableView! var items: [(String, String, String)] = [ ("Test", "123", "1.jpeg"), ("Test2", "236", "2.jpeg"), ("Test3", "678", "3.jpeg") ] override func viewDidLoad() { super.viewDidLoad() var nib = UINib(nibName: "HomeCell", bundle: nil) tableView.registerNib(nib, forCellReuseIdentifier: "bookCell") } // Number row override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.items.count } // Style Cell override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("bookCell") as UITableViewCell // Style here return cell } // Select row override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { // Select } } // PROBLEM HERE class HomeCell : UITableViewCell { @IBOutlet var imgBook: UIImageView @IBOutlet var titleBook: UILabel @IBOutlet var pageBook: UILabel func loadItem(#title: String, page: String, image:String) { titleBook.text = title pageBook.text = page imgBook.image = UIImage(named: image) } }


En mi caso, he declarado un Bool como este:

class Actor { let agent : String? // BAD! // Its value is set to nil, and will always be nil and that''s stupid so Xcode is saying not-accepted. // Technically speaking you have a way around it🤓, you can help the compiler and enforce your value as a constant. See Option3 }

es decir, lo declare sin desenvolver, así es como resolví el error ( sin inicializador ):

class Actor { var agent : String? // It''s defaulted to `nil`, but also has a chance so it later can be set to something different || GOOD! }


Esto es de Apple doc

Las clases y estructuras deben establecer todas sus propiedades almacenadas en un valor inicial apropiado para el momento en que se crea una instancia de esa clase o estructura. Las propiedades almacenadas no se pueden dejar en un estado indeterminado.

Recibe el mensaje de error La clase "HomeCell" no tiene inicializadores porque sus variables están en un estado indeterminado. O creas inicializadores o los haces tipos opcionales, usando! o


No es una respuesta específica a su pregunta, pero recibí este error cuando no había establecido un valor inicial para una enumeración al declararlo como una propiedad. Asigne un valor inicial a la enumeración para resolver este error. Publicar aquí ya que podría ayudar a alguien.


Solución rápida: asegúrese de que todas las variables que no se inicializan cuando se crean (por ejemplo, var num : Int? Vs var num = 5 ) tienen un ? o ! .

Respuesta larga (recomendada): lea el doc según sugiere mprivat ...


simplemente proporcione el bloque de inicio para la clase HomeCell

es trabajo en mi caso


Mi respuesta aborda el error en general y no el código exacto del OP. Ninguna respuesta mencionó esta nota, así que pensé en agregarla.

El siguiente código también generaría el mismo error:

class Actor { let agent : String? }

¡Otros mencionaron que creas inicializadores o los haces tipos opcionales, usando! o cual es correcta. Sin embargo, si tiene un miembro / propiedad opcional, esa opción debería ser mutable, es decir, var . Si realiza un let entonces nunca podría salir de su estado nil . ¡Eso es malo!

Entonces, la forma correcta de escribirlo es:

Opción 1

class Actor { var agent : String? // it has a chance so its value can be set! }

O puedes escribirlo como:

Opcion 2

class Actor { let agent : String? init (agent: String?){ self.agent = agent // it has a chance so its value can be set! } }

o por defecto a cualquier valor (incluido nil que es un poco estúpido)

Opcion3

class Actor { let agent : String? = nil // very useless, but doable. let company: String? = "Universal" }

Si tiene curiosidad sobre por qué let (al contrario de var ) no se inicializa a nil , lea here y here