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