webentwicklung-frage-antwort-db.com.de

'Erforderlicher' Initialisierer 'init (coder :)' muss von der Unterklasse 'UITableViewCell' 'bereitgestellt werden

Dieser Code hat angeblich hier und hier funktioniert, aber ich kann nicht scheinen, dass es funktioniert.

Die IBOutlets sind mit ihren Objekten im Storyboard verbunden. Die prototypeCell ist so benannt, dass ich sie mit dequeueReusableCellWithIdentifier verwenden kann und das benutzerdefinierte Klassenattribut auf commentCell gesetzt ist.

Erster Fehler (den ich lösen kann, aber keiner der oben genannten Links hat es nötig gemacht, was mich dazu bringt, etwas falsch zu machen. Bin ich richtig?):

Overriding method with selector 'initWithStyle:reuseIdentifier:' has incompatible type '(UITableViewCellStyle, String) -> commentCell'

Zweiter Fehler (der interessante Fehler):

'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'`

Zellklassencode:

class commentCell: UITableViewCell {
    @IBOutlet weak var authorLabel: UILabel!
    @IBOutlet weak var commentLabel: UITextView!

    init(style: UITableViewCellStyle, reuseIdentifier: String) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

Initialisierungscode:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    println(comments[indexPath.row])

    var cell = self.tableView.dequeueReusableCellWithIdentifier("prototypeCell") as commentCell

    cell.commentLabel.text = comments[indexPath.row]["comment"] as NSString
    cell.authorLabel.text = comments[indexPath.row]["fromid"] as NSString
    return cell
}
26
User

Die richtige Signatur für den ersten Initialisierer lautet:

init(style style: UITableViewCellStyle, reuseIdentifier reuseIdentifier: String?)

Beachten Sie, dass reuseIdentifier eine Optional ist, wie durch den ? angegeben.

Wenn Sie bestimmte festgelegte Initialisierer einer Klasse überschreiben, erben Sie keine anderen festgelegten Initialisierer. UIView übernimmt jedoch das NSCoding-Protokoll, das einen init(coder:)-Initialisierer erfordert. Also müssen Sie auch diesen implementieren:

init(coder decoder: NSCoder) {
    super.init(coder: decoder)
}

Beachten Sie jedoch, dass Sie in beiden Initialisierern tatsächlich nichts tun, außer Super aufzurufen, sodass Sie keinen der beiden Initialisierer implementieren müssen. Wenn Sie keine festgelegten Initialisierer überschreiben, erben Sie alle festgelegten Initialisierer Ihrer Superklasse.

Mein Rat ist also, dass Sie einfach Ihren init(style:reuseIdentifier:)-Initialisierer vollständig entfernen, es sei denn, Sie fügen etwas Initialisierung hinzu.

Wenn Sie planen, etwas Initialisierung hinzuzufügen, sei darauf hingewiesen, dass Prototypzellen in einem Storyboard nicht von init(style:reuseIdentifier:) initialisiert werden. Sie werden von init(coder:) initialisiert.

41
rob mayoff

Sie sind sich nicht sicher, warum Sie eine benutzerdefinierte UITableViewCell-Klasse benötigen, wenn Sie das Storyboard mit einer Prototypzelle verwenden. Sie können Ihre Beschriftungen und Textansichten einfach in der Zelle ablegen und damit arbeiten.

Wenn Sie von einem Xib aus arbeiten, bekomme ich es, aber Sie brauchen nur:

class commentCell: UITableViewCell {
    @IBOutlet weak var authorLabel: UILabel!
    @IBOutlet weak var commentLabel: UITextView!

}

Sie registrieren dann das Xib in der TableView-Klasse mit:

override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.registerNib(UINib(nibName: "commentCell", bundle: nil),
            forCellReuseIdentifier: "reuseIdentifier")
    }

In Bezug auf die cellForRowAtIndexPath-Funktion wurde die Syntax nun etwas geändert:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

 var cell = self.tableView.dequeueReusableCellWithIdentifier("prototypeCell") as commentCell



        return cell
    }

Wenn Sie auf github posten möchten, können wir Änderungen vornehmen. Es ist schwierig, spezifisch zu sein, ohne mehr Code zu sehen.

2
Steve Rosenberg

Der richtige Weg, UITableViewCell in Swift 4 zu erben:

class MyTableViewCell: UITableViewCell
{    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?)
    {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }
}
1

Swift 4

Implementieren Sie den required init wie vorgeschlagen und fügen Sie super.init(nibName: nil, bundle: nil) in Ihrem benutzerdefinierten Initialisierer hinzu, den Sie hinzufügen

Zum Beispiel:

init(input: ProtocolType? = nil) {
        super.init(nibName: nil, bundle: nil)
        self.input = input
}

required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
}
0
Naishta