2016-03-31 13 views
0

Ich lerne immer noch, wie die Ansicht funktioniert, aber ich fand ein Problem, das ich nicht lösen konnte ... bekam ich die Klasse GraficsBalancGlobalViewController die Unterklasse der Klasse ist GraficViewControllereine Ansicht Laden macht das Programmabsturz

class GraficsBalancGlobalViewController: GraficViewController { 
    @IBAction func afegeixGrafic(sender: NSButton) { 
    addNewGrafic() // which is set on the GraficViewController 
    } 
} 

Und wenn ich die IBAction afegeixGrafic mein Programm stürzt ab, auf der Linie durchführen unten markiert:

class GraficViewController: NSViewController, GraficViewDataSource { 

    @IBAction func button(sender: NSButton) { 
    addNewGrafic() 
    } 

    func addNewGrafic() { 
    let frame = NSRect(x: 0, y: 0, width: self.view.bounds.width , height: self.view.bounds.width * 0.25) 
    let nouGrafic = GraficView(frame: frame) 
    scrollView.addSubview(nouGrafic) <---- BREAK here! 
    } 

    @IBOutlet weak var scrollView: NSView! 
    //...more code 
} 

der Compiler sagt, dass:

fatal error: unexpectedly found nil while unwrapping an Optional value

aber der Knopf (IBAction) innerhalb der GraficViewController funktioniert gut !! Also nehme ich an, dass das Problem mit dem Scroll verwandt ist, aber ich habe keine Ahnung von dem, was werden kann .. Es initialisiert ..

  • nur zu erwähnen, dass die GraficView(frame: frame) ist nicht das Problem, weil ich es und Arbeiten versuchen Gut.
+0

Haben Sie Ihr 'IBOutlet' für' scrollView' überprüft? – Caleb

+0

Fügen Sie einen Haltepunkt an dieser Zeile und beim Breaktyp "p scrollView" in die Debuggerkonsole ein. Ist scrollView nicht? – Darko

+0

@Drako Ja! Du bist richtig scrollView ist nill, aber es existiert, es ist auf dem Bildschirm! –

Antwort

0

ich ! glaube ist der Täter Ihrer Leiden:

@IBOutlet weak var scrollView: NSView! 

Xcode generiert diesen Eintrag mit Kraft unwrap (!) für IBOutlet s, aber es sollte wirklich eine optionale (?), weil sein Sie haben keine Garantien wenn diese Referenz gesetzt wird. Wenn Sie eine gewisse Logik haben, die auf scrollView ‚s Existenz abhängen, können Sie dies tun, indem sie sich auf didSet:

@IBOutlet weak var scrollView: NSView? { 
    didSet { 
     guard let sview = scrollView else { 
      return // because scrollView is nil for some reason 
     } 
     // do your scrollView existence dependent logic here (eg. reload content) 
    } 
} 

func addNewGrafic() { 
    let frame = NSRect(x: 0, y: 0, width: self.view.bounds.width , height: self.view.bounds.width * 0.25) 
    let nouGrafic = GraficView(frame: frame) 
    scrollView?.addSubview(nouGrafic) 
} 

Ich hoffe, das hilft.

+0

Eigentlich habe ich keine Existenz abhängige Logik noch nicht. Benutze die Änderungen, ohne etwas zu schreiben, da '// führe deine scrollView Existenz abhängige Logik hier aus (zB Inhalt neu laden)' wenn ich auf @IBAction 'afegexGrafic' klicke, erscheint nichts auf der Ansicht. Was ich wollte, ist, dass die neue Ansicht innerhalb der Bildlaufansicht, vielleicht bin ich so falsch. –

+0

Wie kann möglich sein, dass die Scrollview ist Null bei der Verwendung der ersten: '@IBAction afegexGrafic' aber bei der Verwendung von' @ IBAction func knopf 'ist nicht '? –

+0

Es gibt keine Garantie, dass diese Ausgänge/Aktionen in einer bestimmten/verlässlichen Reihenfolge stehen. Versuchen Sie das oben (mit der letzten Änderung) – skim

Verwandte Themen