2016-05-03 3 views
1

Ich bin ziemlich neu in der Programmierung im Allgemeinen - und insbesondere in Swift - aber da ist eine Sache, auf die ich mich in letzter Zeit stutzig mache.Zugreifen auf Variablen oder Funktionen in einer "Eltern" -Klasse

Ich versuche auf eine Variable in einer "Eltern" -Klasse zuzugreifen - aber ich kann nicht herausfinden, wie man dorthin kommt.

Ich habe schon an anderen Stellen gesucht, die die gleiche Sache zu decken scheinen - Access variable in different class - Swift, How to create a global variable?, Access variable in different class - Swift und Pass variables from one ViewController to another in Swift - aber keiner von ihnen scheint genau das zu tun, was ich will.

Ich möchte in der Lage sein, ein Fenster der Voreinstellungen zu haben, die ich festlegen und auf Variablen in meiner 'Haupt' Klasse anwenden kann - aber ich kann nicht sehen, wie die Variablen aus dem Fenster Einstellungen übergeben bis zur 'Hauptklasse'.

Hier ist ein Beispiel, in dem ich ein NSTextField auf meinem ersten ViewController definiert habe, das ich in meinem zweiten ViewController ändern und in der ersten Version aktualisieren kann. Meine tatsächliche Anwendung wird wahrscheinlich viele solcher Instanzen benötigen, um eine ganze Reihe modifizierbarer Präferenzen bereitzustellen.

// ViewController.swift 

import Cocoa 


class ViewController: NSViewController { 


lazy var sheet2ViewController: NSViewController = { 
    return self.storyboard!.instantiateControllerWithIdentifier("sheet2") as! NSViewController}() 


@IBAction func openPanel(sender: AnyObject) { 
    displaySheet() 
} 


@IBOutlet weak var textField: NSTextField! 


var textString : String = "" { 
    didSet { 
     textField.stringValue = textString 
    } 
} 


func displaySheet() { 

    self.presentViewControllerAsSheet(sheet2ViewController) 

} 



override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
} 

override var representedObject: AnyObject? { 
    didSet { 
    // Update the view, if already loaded. 
    } 
} 


} 



// SecondViewController.swift 

import Cocoa 

class SecondViewController: NSViewController { 

@IBOutlet weak var textField2: NSTextField! 


@IBAction func closeButton(sender: AnyObject) { 
    ???.textString = textField2.stringValue // How to address the ViewController variable here? 
    self.dismissController(self) 

} 


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

} 

Wie Sie sehen, ist die Frage, die ich habe, ist in der Funktion closebutton in der SecondViewController Klasse - wie der Wert überschreiten zurück bis zum Textstring Variable in der Klasse Viewcontroller?

Ich habe mich mit Delegierung und NSNotificationCenter befasst - aber ich weiß wirklich nicht, ob ich hier die richtigen Bäume belle - es fühlt sich an, als müsste ich etwas viel Komplizierteres implementieren als ich erwarten für eine solche (scheinbar) einfache Anforderung.

Alle Vorschläge sehr willkommen - danke.

Antwort

0

In einem OSX-Storyboard hat NSViewController eine Eigenschaft presentingViewController, die den übergeordneten Ansichtscontroller darstellt.

In SecondViewController können Sie die Präsentation Controller verweisen mit

let parentViewController = presentingViewController as! ViewController 
+0

Dank Vadian - aber wenn ich das versuche, erhalte ich die Fehlermeldung: ‚Instanz Mitglied‚presentingViewController SecondViewController ‚‘‘kann nicht auf Typen verwendet werden.‘ – Moisie

+0

Sie rufen die Methode für den Typ auf, aber Sie müssen sie für die Instanz aufrufen, die Zeile muss innerhalb einer Methode liegen. – vadian

+0

Ah! Großartig - das funktioniert! :-) Vielen Dank!! – Moisie

0

Versuchen Delegierten und Protokolle. Wenn Sie das untergeordnete Element erstellen, legen Sie dessen Delegat als übergeordnetes Element fest. Eine der Delegatmethoden kann einen Parameter haben, den das Kind festlegen kann, und das übergeordnete Element (oder die Klasse, die den Delegaten implementiert) kann lesen.

Ein kleines Beispiel:

protocol MyProtocol { 
    func turnedOn(val:Bool) -> Void 
} 

class Headlights { 
    var delegate:MyProtocol? 

    func test1() -> Void { 
     if let del = delegate { 
      del.turnedOn(true) 
     } 
    } 
} 

class Car:MyProtocol { 
    var lamp:Headlights 

    init() { 
     lamp = Headlights() 
     lamp.delegate = self 
    } 

    func turnedOn(val:Bool) -> Void { 

    } 
} 
+0

Danke Horatiu. Ich denke, ich werde mehr Zeit für das Studium von Protokollen und Delegationen brauchen - es hat einfach noch nicht geklickt. In der Zwischenzeit bekommt Vadian's Antwort, was ich für den Moment tun muss. – Moisie

Verwandte Themen