webentwicklung-frage-antwort-db.com.de

Klasse hat keine Initialisierer Swift

Ich habe ein Problem mit der Swift-Klasse. Ich habe eine Swift-Datei für die Klasse UITableViewController und die Klasse UITableViewCell. Mein Problem ist die UITableViewCell-Klasse und Outlets. Diese Klasse hat einen Fehler Klasse "HomeCell" hat keine Initialisierer , und ich verstehe dieses Problem nicht.

Danke für deine Antworten.

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)
    }

}
165
Kevin Py

Sie müssen implizit nicht verpackte Optionals verwenden, damit Swift während der Initialisierungsphase kreisförmige Abhängigkeiten bewältigen kann (übergeordnetes <-> Kind der Komponenten der Benutzeroberfläche).

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

Lesen Sie diese doc , sie erklären alles schön.

240
mprivat

Quick Fix - Stellen Sie sicher, dass alle Variablen, die beim Erstellen nicht initialisiert werden (z. B. var num : Int? vs. var num = 5), entweder einen ? oder einen ! haben.

Lange Antwort (empfohlen) - Lesen Sie die doc wie von mprivat vorgeschlagen ...

88
Byron Coetsee

Dies ist von Apple doc

Klassen und Strukturen müssen alle ihre gespeicherten Eigenschaften auf einen geeigneten Anfangswert setzen, wenn eine Instanz dieser Klasse oder Struktur erstellt wird. Gespeicherte Eigenschaften können nicht in einem unbestimmten Zustand belassen werden.

Sie erhalten die Fehlermeldung Class "HomeCell" hat keine Initialisierer, da sich Ihre Variablen in einem unbestimmten Zustand befinden. Entweder Sie erstellen Initialisierer oder Sie machen sie mit! oder ?

30
CodeHelp

Einfache antwort:

Meine Antwort behebt den Fehler im Allgemeinen und nicht den genauen Code des OP. Keine Antwort erwähnte diese Notiz, also dachte ich, ich füge sie hinzu.

Der folgende Code würde auch den same Fehler erzeugen:

class Actor {
    let agent : String?
}

Andere erwähnten, dass Entweder Sie erstellen Initialisierer oder Sie machen sie mit! oder ? welches ist richtig. Wenn Sie jedoch über ein optionales Element/eine optionale Eigenschaft verfügen, sollte dieses optional veränderbar sein, dh var. Wenn Sie eine let erstellen, kann niemals den nil-Status verlassen. Das ist schlecht!

Die korrekte Schreibweise lautet also: 

Option 1:

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

Oder Sie können es schreiben als: 

Option 2:

class Actor {
let agent : String?

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

oder voreingestellt auf einen beliebigen Wert (einschließlich nil, was irgendwie dumm ist) 

Option3:

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

Tiefe antwort:

Meine Antwort behebt den Fehler im Allgemeinen und nicht den genauen Code des OP. Keine Antwort erwähnte diese Notiz, also dachte ich, ich füge sie hinzu.

Der folgende Code würde auch den same Fehler erzeugen:

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
}

Andere erwähnten, dass Entweder Sie erstellen Initialisierer oder Sie machen sie mit! oder ? welches ist richtig. Wenn Sie jedoch über ein optionales Element/eine optionale Eigenschaft verfügen, sollte dieses optional veränderbar sein, dh var. Wenn Sie eine let erstellen, kann niemals den nil-Status verlassen. Das ist schlecht!

Die korrekte Schreibweise lautet also:

Option 1

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!
}

Oder Sie können es schreiben als:

Option 2

class Actor {
let agent : String? // It's value isn't set to nil, but has an initializer || GOOD!

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

oder voreingestellt auf einen beliebigen Wert (einschließlich nil, was irgendwie dumm ist)

Option3

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

Wenn Sie neugierig sind, warum let (im Gegensatz zu var) nicht mit nil initialisiert wird, lesen Sie here und here

22
Honey

In meinem Fall habe ich eine Bool wie folgt erklärt:

var isActivityOpen: Bool 

das heißt, ich habe es deklariert, ohne das Paket zu entfernen. Dies ist, wie ich den Fehler ( kein Initialisierer ) gelöst habe:

var isActivityOpen: Bool!
8
Anurag Sharma

Keine spezifische Antwort auf Ihre Frage, aber ich hatte diesen Fehler, als ich bei der Deklaration als Eigenschaft keinen Anfangswert für eine Aufzählung festgelegt hatte. Ich habe der Aufzählung einen Anfangswert zugewiesen, um diesen Fehler zu beheben. __ Posting hier, da es jemandem helfen könnte.

1
Sonu VR

geben Sie einfach den Init-Block für die HomeCell -Klasse an

es ist Arbeit in meinem Fall

0
anoopbryan2