OS X 10.13 - Swift 4 - Warten bis aufgerufener ViewController geendet hat?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • OS X 10.13 - Swift 4 - Warten bis aufgerufener ViewController geendet hat?

    Hallo,

    ich rufe aus einer Funktion (A) einen ViewController (VCN) auf und möchte warten bis dieser vollständig beendet ist. Erst dann soll mit der weiteren Bearbeitung innerhalb der aufrufenden Funktion (A) fortgefahren werden.

    Wie funktioniert dies? Kann mir da jemand die notwendigen Infos oder einen Beispielaufruf, -syntax mitteilen?

    Vielen Dank mal vorab.
  • MCDan schrieb:

    Wenn Du den ViewController als Sheet per beginSheet(_:completionHandler:) anzeigst, dann wird beim Beenden des Sheets der completionHandler aufgerufen.

    Alternativ ist die Frage, wie Du den ViewController anzeigst?

    Neben der Anzeige als Sheet, könntest Du den ViewController natürlich auch per runModal(for:) modal anzeigen.
    Anbei mal der Code welchen ich nutze um den VC anzuzeigen.

    Quellcode

    1. let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
    2. let nachrichtenWindowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "SheetViewController")) as! NSViewController
    3. ownVC.presentViewControllerAsSheet(nachrichtenWindowController)

    Ich habe es nun geändert, aber dennoch erziele ich nicht das gewünschte Ergebnis?

    Quellcode

    1. let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
    2. let nachrichtenWindowController: NSViewController = { return storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "ViewController")) as! NSViewController }()
    3. ownnVC.presentViewControllerAsSheet(nachrichtenWindowController)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von OSXDev ()

  • Ich sehe da jetzt keinen Unterschied bei der Anzeige des ViewControllers. ;)

    Wenn Du Dir die Doku zu beginSheet(_:completionHandler:) einmal anschaust, dann solltest Du erkennen, dass beginSheet(_:completionHandler:) eine Methode/Funktion von NSWindow ist.

    Dein Code sollte dann in etwa so aussehen (Swift Syntax bitte ggf. anpassen!):

    Quellcode

    1. let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
    2. let nachrichtenWindowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "SheetViewController")) as! NSViewController
    3. let nachrichtenWindow = NSWindow().init(nachrichtenWindowController)
    4. ownVC.view.window.beginSheet(nachrichtenWindow, completionHandler: { () in print("Done") })
    Das angezeigt Window bzw. den ViewController solltest Du dann mit endSheet(_:) beenden.
  • MCDan schrieb:

    let nachrichtenWindow = NSWindow().init(nachrichtenWindowController)
    ownVC.view.window.beginSheet(nachrichtenWindow, completionHandler: { () in print("Done") })
    Diese Zeilen bereiten mir großes Kopfzerbrechen ?( . Wenn ich dies richtig verstanden habe, dann wird
    1.) ein neuer WindowControllerstack erstellt?
    2.) der vorhandene angehalten und erst wenn die Funktion endSheet(_:) aufrufen wird zu diesem zurückgekehrt?

    Eigentlich genau was ich mir erhofft hatte. :)

    Müsste dies nicht in einer eigenen Class realisiert werden? Deinen Sourcecode ohne dieses Hintergrundwissen anzupassen fehlt mir schwer. Vielleicht kannst Du mir da ein wenig mehr auf die Sprünge helfen.

    MCDan schrieb:

    beginSheet(_:completionHandler:)
    Mir ist aufgefallen, dass es sich hierbei um eine Funktion von NSWindow handelt. Nur war mir der Zusammenhang eines im Storyboard erstellten VC nicht wirklich klar. Da ich mit dieser Funktion doch die automatische Verwaltung derer beeinflusse, oder nicht?
  • Zeile 1 erzeugt ein neues Window mit dem ViewController aus dem Storyboard als contentViewController.

    Zeile 2 zeigt dann dieses Window als Sheet im Window des ownVC ViewControllers an. Da beginSheet(_:completionHandler:) einen completionHandler hat, wird die Verarbeitung natürlich direkt nach Zeile 2 fortgesetzt. Die Anzeige des Sheets ist asynchron und beim Beenden des Sheets wird dann der completionHandler aufgerufen. Darin kannst Du dann auf die "Ergebnisse" des Sheets reagieren.

    Warum soll man dafür eine eigene Class erstellen?

    Du könntest im Storyboard auch direkt einen WindowController mit ViewController anlegen. Dann brauchst Du die erste Zeile zum Erzeugen des Windows nicht und könntest direkt über das window Property des WindowControllers auf das Window zugreifen. Evtl. musst Du den WindowController dann noch in einem Property referenzieren, da dieses sonst evtl. direkt entfernt wird.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • MCDan schrieb:

    Zeile 1 erzeugt ein neues Window mit dem ViewController aus dem Storyboard als contentViewController.

    Zeile 2 zeigt dann dieses Window als Sheet im Window des ownVC ViewControllers an. Da beginSheet(_:completionHandler:) einen completionHandler hat, wird die Verarbeitung natürlich direkt nach Zeile 2 fortgesetzt. Die Anzeige ist des Sheets ist asynchron und beim Beenden des Sheets wird dann der completionHandler aufgerufen. Darin kannst Du dann auf die "Ergebnisse" des Sheets reagieren.

    Warum soll man dafür eine eigene Class erstellen?

    Du könntest im Storyboard auch direkt einen WindowController mit ViewController anlegen. Dann brauchst Du die erste Zeile zum Erzeugen des Windows nicht und könntest direkt über das window Property des WindowControllers auf das Window zugreifen. Evtl. musst Du den WindowController dann noch in einem Property referenzieren, da dieses sonst evtl. direkt entfernt wird.
    @MCDan: Vielen Dank für Deine ausführliche Erklärung :thumbsup: .

    Mit dem jetzigen Wissen, musste ich nur ein paar Änderungen eingepflegen und siehe da es funktioniert einwandfrei. :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev ()