webentwicklung-frage-antwort-db.com.de

Instantiieren Sie die Ansicht von der Spitze, die einen Fehler auslöst

Ich habe versucht, eine @IBDesignable UIView-Unterklasse nach diesem ( link ) Tutorial zu erstellen. Die erste benutzerdefinierte Ansicht ist gut. Aber wenn ich versuche, einen anderen zu machen, habe ich Fehler. Zuerst bekam ich failed to update auto layout status: the agent crashed und Failed to render instance of .... Irgendwie fing ich an, Projekte mit diesen Fehlern zu erstellen und auszuführen, aber dann bekomme ich einen neuen Fehler - EXC_BAD_ACCESS ... in der Zeile let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView. Hier ist die ganze Methode:

func loadViewFromNib() -> UIView {

        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: "advancedCellView", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }

Mit dem ersten benutzerdefinierten UIView ist das kein Problem. Ich benutze den gleichen Code ..

 enter image description here

Irgendwelche Ideen? Vielen Dank

16
Lachtan

Die loadViewFromNib()-Methode, die Sie posten, sieht gut aus. Sie erhalten das Bundle richtig und geben den Namen der Spitze als Stringliteral an. Es sollte also die Spitze finden. Wie jemand anderes kommentiert hat, ist es wahrscheinlich nicht richtig, wenn Sie die Feder einrichten. Hier sind ein paar Dinge, die Sie überprüfen sollten:

  1. Sie sollten AdvancedCellView als Benutzerdefinierte Klasse der Datei im Identitätsinspektor festgelegt haben.
  2. Prüfen Sie auch, ob das Modul korrekt ist - in der Regel möchten Sie es nur leer lassen.
  3. Die benutzerdefinierte Klasse für die Ansicht sollte nicht festgelegt werden. Belassen Sie sie einfach als Standard (UIView). Wenn Sie in der Seitenleiste einen aussagekräftigeren Namen als "Ansicht" haben, ist dies wahrscheinlich falsch.
  4. Stellen Sie sicher, dass sich in der Spitze nur ein Objekt der obersten Ebene befindet. Die Seitenleiste sollte ohne weitere Einträge so aussehen, wenn die Ansichtsstruktur reduziert ist.

 Nib hierarchy with only one top level view

N.B. Diese Antwort bezieht sich auf das Tutorial, mit dem das OP verbunden ist, und nicht auf die richtige Art, eine Feder einzurichten.

40
Josh Heald

Die instantiateWithOwner(options:)-Methode gibt ein Array zurück, keine Ansicht. Daher wird ein erzwungener Downcast auf UIView niemals funktionieren. Versuchen Sie stattdessen, den tatsächlichen Typ [AnyObject] zu verwenden.

Die Elemente im Array entsprechen den Objekten der obersten Ebene in der Nib-Datei. Daher sollte die gewünschte Ansicht eines der Array-Elemente sein. Angesichts des Namens Ihrer Nib-Datei wird höchstwahrscheinlich nur ein Objekt der obersten Ebene im Array vorhanden sein - die Zelle, die Sie laden möchten. Stellen Sie sicher, dass sich in der Nib-Datei nur ein Objekt der obersten Ebene befindet und dass es sich tatsächlich um eine Instanz einer Unterklasse von UIView handelt.

Beachten Sie, dass Ihre Implementierung möglicherweise ineffizient ist. Wenn Sie mehr als eine Zelle laden, sollten Sie die UINib-Instanz zwischenspeichern, anstatt jedes Mal eine neue zu erstellen. Beachten Sie, dass Framework-Klassen wie UITableViewController über integrierte Methoden zum Registrieren von Spitzen verfügen, die sich automatisch um diese Details kümmern, sodass Sie dies möglicherweise nicht selbst tun müssen.

2
jlehr

Ich habe mir das Tutorial angesehen und festgestellt, dass Sie den Fehler erhalten, wenn Sie das View-Element in Ihrem benutzerdefinierten Xib subclassieren. Stellen Sie sicher, dass Sie nur den "Eigentümer der Datei" auf Ihre benutzerdefinierte Klasse festgelegt haben.

 enter image description here

1
B-Rad

Versuchen Sie es stattdessen. Funktioniert immer für mich:

let picker = NSBundle.mainBundle().loadNibNamed("advancedCellView", owner: nil, options: nil)
let view = picker[0] as! UIView

return view

Sag mir, ob das funktioniert

1
brl214