2016-12-02 5 views
1

In meinem AppDelegate 's applicationDidFinishLaunching Ich muss ein Objekt mit Daten von der Festplatte lesen, und dann dieses Objekt an den ursprünglichen Ansicht Controller für die Anzeige übergeben. Was wäre der beste Weg, dies zu tun?Was ist die beste Methode, um ein Objekt beim Anwendungsstart an einen NSViewController zu übergeben?

Im Moment bin Laden ich das Drehbuch programmatisch wie so:

func applicationDidFinishLaunching(_ aNotification: Notification) { 
    importantThing = ImportantThing() 
    importantThing.load(url: URL(fileURLWithPath: "...")) 

    let storyboard = NSStoryboard(name: "Main", bundle: nil) 
    myWindowController = storyboard.instantiateController(withIdentifier: "MyWindowController") as! NSWindowController 
    (myWindowController.contentViewController as? MyViewController)?.importantThing = importantThing 
    myWindowController.showWindow(self) 
} 

Aber das fühlt sich klobig. Zum einen wird die Eigenschaft nach viewDidLoad festgelegt, so dass jetzt Setup ist seltsam.

Es muss einen besseren Weg geben, dies zu tun. Wenn es möglich ist, möchte ich nicht auf ein Singleton zurückgreifen, da ich tatsächlich ein paar miteinander verbundene Objekte einrichten muss (zwei Objekte mit wichtigem Status, die Referenzen zueinander haben, aber es macht keinen Sinn, entweder die andere). Was wäre ein guter Weg, um das zu lösen?

+0

"Die Eigenschaft wird nach' viewDidLoad' eingestellt "Ich bin kein Experte, aber bist du dir sicher? – matt

+0

Ja, ich habe versucht, den Eigenschaftswert in 'viewDidLoad' zu protokollieren und es ist immer noch'nil' –

+0

Noch einmal getestet, um sicher zu sein, und wenn ich" viewDidLoad "und" didSet "in ihren jeweiligen Funktionen drucke, erscheint" viewDidLoad "zuerst . –

Antwort

1

Was Sie im App-Delegaten tun, ist korrekt. Als für das, was Sie im View-Controller, Apples Master-Detail-App-Vorlage zeigt Ihnen das richtige Muster tun sollte (Ich habe ein paar Kommentare hinzugefügt):

// the interface 
@IBOutlet weak var detailDescriptionLabel: UILabel! 

// the property 
var detailItem: NSDate? { 
    didSet { 
     self.configureView() 
    } 
} 

func configureView() { 
    // check _both_ the property _and_ the interface 
    if let detail = self.detailItem { // property set? 
     if let label = self.detailDescriptionLabel { // interface exists? 
      label.text = detail.description 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // at this point, its _certain_ that the interface exists 
    self.configureView() 
} 

Wenn man darüber nachdenkt, werden Sie sehen, dass Die Schnittstelle wird korrekt aktualisiert unabhängig von der Reihenfolge der Ereignisse - das heißt, unabhängig davon, ob viewDidLoad oder die Einstellung der Eigenschaft zuerst kommt. Folge einfach diesem Muster.

+0

UILabel für Kakao? Interessant ... –

+0

@ElTomato Es ist das Muster, nicht die Details. :) – matt

+0

Alles klar, es sieht so aus, als wäre es nahe genug an dem, was ich mir vorstellen sollte. Ich dachte, dass es eine bessere Lösung geben könnte, die ich nicht sah, aber wenn Apple selbst dies vorschlägt, sehe ich nicht, warum ich nicht damit gehen sollte. Vielen Dank. –

Verwandte Themen