Seque aus Toolbar Aktion

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

  • Seque aus Toolbar Aktion

    Hi,
    ich versuche mich mal mir Swift und baue derzeit eine Testanwendung um mit dem GUI und Swift näher zu kommen.
    Derzeit habe ich im Projekt zwei WindowController und zwei ViewController.

    BenutzerWindowController + BenutzerViewController haben eine Auflösung von 600x400 Pixel und haben keine Toolbar
    AnwendungWindowsController + AnwendungViewController haben eine Auflösung von 1200x800 Pixel mit Toolbar

    Der Einstiegspunkt liegt beim BenutzerWindowsController.
    Dort sind 4 Benutzerkonten dargestellt und durch drücken der Schaltfläche 1 schliesst sich das Benutzerfenster
    Das Anwendungsfenster wird geöffnet Parameter werden initialisiert und die Datenbank1 soll geladen werden.

    Soweit so gut.
    Im Anwendungsfenster ist eine Toolbar mit einem Item den ich Benutzer genannt habe.
    Wenn ich diesen drücke, soll die Datenbank gespeichert, das Anwendungsfenster geschlossen und das Benutzerfenster
    wieder geöffnet werden.

    Der Code für das Toolbar Item Benutzer

    Quellcode

    1. @IBAction func klickToolbarBenutzer(_ sender: Any) {
    2. // Datenbank Speichern
    3. // Anwendungsfenster schliessen
    4. self.window?.close()
    5. // Benutzerfenster öffnen
    6. self.performSegue(withIdentifier: "Benutzer", sender: self)
    7. print("Benutzerfenster wurde geöffnet")
    8. } // klickToolbarBenutzer
    Die Segue Verbindung wird ja vom AnwendungWindowController zum BenutzerViewController gemacht, dann kann ich keine Bezeichnung festlegen.
    Die Bezeichnung der Verbindung sollte "Benutzer" sein.
    Eine Verbindung von WindowsController zu WindowController funktioniert nicht und habe schon einige Möglichkeiten probiert.
    Wenn ich aber eine Verbbindung von dem Toolbar Item Benutzer zum BenutzerWindowsController herstelle, kann ich diese dann auch namentlich definieren.
    Drücke im im laufenden Programm in de rtoolbar Benutzer, dann wird das Benutzerfenster auch geöffnet.
    Was jetzt nicht funktioniert, ist die Action Methode, die ich definiert habe. In der Methode soll die Datenbank gespeichert werden und anschliessend das
    Anwendungsfenster geschlossen werden.

    Über Hilfe würde ich mich sehr freuen.

    Vielen Dank
  • Dein Beitrag hinterlässt mich verwirrt:
    • Geht es um macOS oder iOS?
    • Wie sieht das Storyboard aus? Vielleicht mit Screenshot.
    • Hast Du eine Seque "Benutzer" im Interface Builder angelegt? Von wo nach wo und welche Art von Segue?
    • "...funktioniert nicht und habe schon einige Möglichkeiten probiert" qualifiziert sich nicht als hilfreiche Fehlerbeschreibung
    • Das Thema "Datenbank speichern" ist ja erst einmal irrelevant, da eh nur in den Kommentaren erwähnt
    • Was konkret funktioniert an der geposteten Methode nicht?
    Ich weiss ja nicht, ob's am Vorweihnachtsstress liegt, aber versucht einmal bitte Eure Fragestellungen aus Sicht eines Dritten zu lesen? Sind alle relevanten (!) Informationen enthalten? Habe ich mein Problem verständlich beschrieben? Ist meine Fragestellung klar?

    Das soll jetzt nicht oberlehrerhaft rüberkommen, aber bei solchen Postings fällt die Hilfestellung schwer ... wir können nicht hellsehen.

    Solltest Du Dich auf iOS bewegen, schau Dir einmal das Konzept eines UINavigationControllers an, damit kommst Du leichter an's Ziel.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hi Mattes,

    ich bemühe mich immer so ausführlich wie möglich und nur das nötigste zu erklären. Klappt halt nich immer :)
    Es ist eine macOS Anwendung.

    Was definitiv nicht funktioniert ist beim Betätigen von Benutzer in der Toolbar das dann das Anwendungsfenster schliesst
    und das Benutzerfenster öffnet.

    Es funktioniert immer nur eins von beiden.

    Das Seque Benutzer das ich im IB angelegt habe von ToolbarBenutzer zum BenutzerViewController funktioniert wenn ich
    im laufenden Programm darauf klicke. Leider wird aber der hinterlegt code welches ich als Action definiert habe nicht ausgeführt.

    Wenn ich die Seque "Benutzer im IB wieder entferne, dann wird der Code ausgeführt, aber das Benutzerfenster wird nicht geöffnet.

    Es klappt immer nur das eine oder das andere??

    Storyboard.jpg
  • Disclaimer: Ich habe gerade zum ersten Mal (in einer macOS-App) Storyboards verwendet, um Deinen Fall einmal auszuprobieren.

    Hier mein Ansatz (obwohl ich den Ansatz mit gegenseitig schliessenden Fenstern krude finde, hier würde ich mein Benutzerkonzept einmal überdenken):
    • Zwei WindowController mit je einem ViewController
    • In den Views jeweils einen PushButton, der eine Segue triggert
    • Die Segues jeweils vom Typ "Show", weisend auf den anderen WindowController
    • In den jeweiligen ViewController-Implementierungen eine Methode prepareForSegue:..., in der das verlassende Fenster geschlossen wird
    Der genannte Code sieht dann wie folgt aus:

    Quellcode

    1. - (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender
    2. {
    3. if ([segue.identifier isEqualToString:@"Pop"])
    4. {
    5. [self.view.window close];
    6. }
    7. }
    Wie gesagt, ich finde es rein von der Ästhetik nicht optimal, aber es funktioniert...

    Mattes

    Bildschirmfoto 2017-12-22 um 08.51.49.png
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Vielen Dank,
    das ist das zweite mal das ich überhaupt eine macOS App programmiere.
    iOS habe ich noch nicht gemacht und ausserdem ist es dar erste mal, das ich mehrere Fenster benutze.
    In meiner ersten macOS App habe ich Objective-C benutzt, diesmal Swift.

    Also ist alles noch neu und bin am Lernen, kann aber nicht sagen das ich Objective-C beherrsche.

    Wenn Du sagst, das mein Vorgehen nicht schön ist, dann bin ich gerne für eine alternative offen.
    Wahrscheinlich weil mit jedem neuen öffnen eines Fensters eine neue Instanz erstellt wird, was den Speicher
    belastet und vielleicht schwierig mit Übertragen der Variablen zusammenhängen könnte??
    Ich hatte deshalb zwei WindowController benutzt, weil das Benutzerfenster keine Toolbar besitzen sollte,
    das Anwendungsfenster schon. Ich weiss auch nicht wie ich das sonst hätte machen sollen.
    In Deinem Storyboard hast Du den Back Button in einem ViewController (Back Button)
    In meinem Storyboard ist der Back Button als Toolbar Item im WindowController. Nicht im ViewController.


    Ich lerne aus Büchern und Tutorials, sowie aus dem Netz. Leider ist vieles veraltet und funktioniert aktuell anders.
    Auch finde ich keine Literatur über Swift und macOS Programmierung. Alle Welt möchte scheinbar nur iOS
    programmieren und daher gibt es nur Literatur für iOS, was ich sehr schade finde.

    Ich würde mich sehr freuen, wenn du mir zeigst, die du das lösen würdest.

    Vielen Dank

    P.S. Ich musste das Storyboard mehrmals als Screenshot speichern und mit Photoshop zusammensetzen, weil der zoom (Editor/zoom = 100%) nicht einstellbar ist. Alles ist ausgegraut. Unter ElCapitan als auch unter High Sierra besteht das Problem. Mit der Tastenkombination cmd+ taste rauf oder runter klappt ebenfalls nicht. Gibt es da einen anderen Trick?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von C3PO ()

  • C3PO schrieb:

    Ich hatte deshalb zwei WindowController benutzt, weil das Benutzerfenster keine Toolbar besitzen sollte,
    das Anwendungsfenster schon. Ich weiss auch nicht wie ich das sonst hätte machen sollen.
    In Deinem Storyboard hast Du den Back Button in einem ViewController (Back Button)
    In meinem Storyboard ist der Back Button als Toolbar Item im WindowController. Nicht im ViewController.
    Das macht nicht so den riesigen Unterschied:
    • Nutze für Dein "Benutzer"-Fenster einen eigenen WindowController, der dann die entsprechende prepareForSegue:sender:-Methode implementiert (und dann natürlich ein [self.window close] aufruft).
    • Im "Anwendungs"-ViewController packst Du den Code an die o. g. Stelle.
    Das war nun aber eine einfache Transferleistung: Wenn Du (wegen der Toolbar) einen WindowController zum Steuern der Segue verwendest, musst Du diesen eben auch implementieren und anpassen, um das Segue-Verhalten zu beeinflussen. Versuch einmal, Dir über den strukturellen Aufbau, die Zuständigkeiten und Abhängigkeiten der UI- und Controller-Klassen klar zu werden.

    Zum UI-Design: Viele Wege führen nach Rom, ich würde wahrscheinlich die Anwendung in einem Hauptfenster darstellen und den Benutzer-Dialog als Sheet oder modalen Dialog darstellen.

    Mattes

    P.S.: Das Zoomen scheint im IB nur bei iOS-Storyboards zu funktionieren ... warum auch immer. Aber das wird mit den mysteriösen Cross-Platform-Apps bestimmt besser :D
    Diese Seite bleibt aus technischen Gründen unbedruckt.