2016-03-31 17 views
0

Wie kann möglich sein, dass die scrollview ist Null bei der Verwendung der ersten: @IBAction afegeixGrafic aber bei der Verwendung @IBAction func button ist es nicht '? bekam ich die Klasse GraficsBalancGlobalViewController die Unterklasse der Klasse ist GraficViewControllerWarum ist mein scrollView null?

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

Und wenn ich die IBActionafegeixGrafic 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 arbeitet wel l !! Also nehme ich an, dass das Problem mit dem Scroll verwandt ist, aber ich habe keine Ahnung von dem, was werden kann .. Es initialisiert ..

Ich versuche, dies zu:

@IBOutlet weak var scrollView: NSView? { 
    didSet { 
    guard let sview = scrollView else { 
     addNewGrafic() 
     return // because scrollView is nil for some reason, but don't work 
    } 
    } 
} 

The call stack

enter image description here

Voll Code:

class GraficsBalancGlobalViewController: GraficViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do view setup here. 
} 

@IBAction func afegeixGrafic(sender: NSButton) { 
    //performSegueWithIdentifier("Nou Grafic", sender: nil) 
    //let viewController = storyboard!.instantiateControllerWithIdentifier(identifier!) as! GraficsBalancGlobalViewController 
    addNewGrafic() 

} 

@IBAction func eliminaGrafic(sender: NSButton) { 
} 

} 

enter image description here

+0

'scrollView' wird immer Null in Ihrem letzten Codeblock sein - das ist, was die Wache für prüft - und es fällt in die sonst nur wenn es null ist –

+0

ja, tut mir leid, das kann verwirrend sein. Der letzte Code-Teil ist nicht wichtig, der wichtigste ist der erste. –

+0

Zeigen Sie uns den Aufrufstapel an der Stelle des Fehlers. –

Antwort

1

Es ist nicht, weil Sie graficsBalancGlobalViewController instanziiert haben. Sie haben es mit einem xib oder einem Storyboard eingerichtet, ohne es jedoch instanziiert zu haben. Tun Sie dies:

let viewController = storyboard.instantiateControllerWithIdentifier(identifier) as GraficsBalancGlobalViewController 

nicht dieses:

let viewController = GraficsBalancGlobalViewController() 
+0

Habe ich' let viewController = GraficsBalancGlobalViewController() '? Ich bin neu dabei. Und wo genau sollte ich das verwenden: 'Lassen Sie ViewController = Storyboard.InstantiateControllerWithIdentifier (Bezeichner) als GraficsBalancGlobalViewController'? Kannst du mir ein bisschen erklären, wie es funktioniert? –

+0

Welche Klasse auch immer instanziiert wird GraficsBalancGlobalViewController sollte es auf diese Weise erstellen. Ich nehme an, irgendwo (nicht oben erwähnt) hast du eine Zeile wie self.presentViewController (viewController, animiert: true, completion: nil). Was ich gesagt habe, geht direkt darüber hinaus. Wenn es instanziiert und wie folgt verschoben wurde: self.performSegueWithIdentifier ("GraficsBalancGlobalViewControllerID", sender: nil) und Sie erhalten immer noch eine Null, weil beim Erstellen des IBOutlet etwas kaputt gegangen ist.In diesem Fall löschen Sie @IBOutlet schwach var scrollView und ziehen Sie es erneut aus dem Schnittstellen-Generator. –

+0

Ich denke, dass mein Code nicht so fortgeschritten ist :(, hast du das erwartet? (Ich füge den obigen Code hinzu), ich lerne immer noch, wie es geht. –