NSPopUp Button / Menü

Dieses Thema im Forum "macOS-Developer" wurde erstellt von OSX Phil, 24.05.16.

Schlagworte:
  1. OSX Phil

    OSX Phil Erdapfel

    Dabei seit:
    24.05.16
    Beiträge:
    4
    Hallo Zusammen,

    ich hoffe ich habe mein Anliegen im richtigen Themenbereich eingestellt. Falls nicht, nicht böse sein ist mein erstes Thema.

    Also ich bin gerade dabei mich in XCODE Cocoa einzuarbeiten und prompt bin ich an einem Punkt angekommen, den ich ohne fachkundigen Rat nicht lösen kann.

    Meine OSX App soll folgende Aufgabe lösen können. Mit PHP und HTML ist es ganz simpel ein Menü zu realisieren, beim dem der angezeigte Menüpunkt (Titel) einen anderen Wert hat. Wenn Titel und Wert gleich sind habe ich keine Probleme diesen auszulesen und weiterzuverarbeiten.

    Beim erstellen der Menüeinträge für mein PopUp Button Menü (hat den Namen popUp) habe ich bisher die Methode
    [popUp addItemWithTitle:<#(nonnull NSString *)#>]; verwendet. Dieses lässt es aber nicht zu, zu jedem Titel einen Wert zu hinterlegen. Nun bin ich auf die Methode
    [myMenu addItemWithTitle:<#(nonnull NSString *)#> action:<#(nullable SEL)#>]; aufmerksam geworden. Genau hier liegt das Problem. Diese kann ich irgendwie nicht auf mein PopUp Button Menü anwenden.

    Der bisherige XCODE sah so aus:
    ....
    - (IBAction)add:(id)sender {
    [popUp removeAllItems];
    [popUp addItemWithTitle:mad:"Wein"];
    [popUp addItemWithTitle:mad:"Bier"];
    [popUp addItemWithTitle:mad:"Wasser"];
    }

    Mit dieser Methode wurde der gewählte Menüeintrag aus dem PopUP Menü in ein label-Feld (label) geschrieben:
    - (IBAction)update:(id)sender {
    [label setStringValue:[popUp titleOfSelectedItem]];
    }

    Die ADD-Methode habe ich nun wie folgt abgeändert:
    - (IBAction)add:(id)sender {

    // Alle zugordneten Menüeinträge löschen
    [popUpremoveAllItems];

    // Speicher für das Menü reservieren und initialisieren
    NSMenu * myBibliothek = [[NSMenu alloc] init];
    NSMenuItem * menuItem = [[NSMenuItem alloc] init];

    // Jedem Menüeintrag den zugehörigem Wert zuordnen
    menuItem = [myBibliothek addItemWithTitle:mad:"Wein" action:mad:selector(update:) keyEquivalent:mad:"Alkohol"];
    menuItem = [myBibliothek addItemWithTitle:mad:"Bier" action:mad:selector(update:) keyEquivalent:mad:"Alkohol"];
    menuItem = [myBibliothek addItemWithTitle:mad:"Wasser" action:mad:selector(update:) keyEquivalent:mad:"Okay"];

    [menuItem setTarget:self];
    [menuItem setRepresentedObject:menuItem];

    // An dieser Stelle komme ich nun nicht weiter! Wie verbinde ich nun dieses Menü mit meinem Pop Up Button Menü?
    }

    Ist für einen Profi sicherlich schnell zu lösen. Ich bin für jeden für Hinweise und Erklärungen dankbar.

    Viele Grüße
     
  2. RUMTom

    RUMTom Grahams Jubiläumsapfel

    Dabei seit:
    11.09.04
    Beiträge:
    104
    Code:
    [popUp setMenu: myBibliothek];
    Wobei weiter oben beim Menü bauen auch was nicht zu stimmen scheint. Allerdings verstehe ich nicht die Aussage:
    Welcher Wert? Was willst du erreichen, wenn ein Menüpunkt gewählt wird?
     
  3. OSX Phil

    OSX Phil Erdapfel

    Dabei seit:
    24.05.16
    Beiträge:
    4
    Bildschirmfoto 2016-05-25 um 12.57.44.png Hallo RUMTom,

    erst einmal Danke für Deine Hilfe.

    Gedacht ist folgendes: Wählt der Anwender ein Item (Titel) aus dem Pop-Up-Menü aus z. B.: Wein soll "Alkohol" (als Wert) zurückgeliefert bzw. im Label-Feld (Hinweisfeld) ausgegeben werden.

    Hoffe es ist so verständlicher.

    Ich habe entsprechend Deinem Hinweis das Menü mit dem PopUp verbunden und es funktioniert. Der PopUp Menü zeigt nun die festgelegten Items an. Jedoch werden die ersten Beiden Menüpunkte deaktiviert (grau hinterlegt) und die Update Methode für das Label-Feld zeigt auch nichts an.

    Muss ich bei action: etwas anderes eintragen? Wahrscheinlich muss in der Update-Methode der zugehörige Wert anders ausgelesen werden?
     
    #3 OSX Phil, 25.05.16
    Zuletzt bearbeitet: 25.05.16
  4. RUMTom

    RUMTom Grahams Jubiläumsapfel

    Dabei seit:
    11.09.04
    Beiträge:
    104
    Bleib mal bei deinem ersten Versuch. Die IBAction ändere so, das auf dein NSPopUpButton verwiesen wird, nicht auf id.
    Möchtest du alles in Code machen, oder im Interfacebuilder?
    Code:
    - (IBAction)update:(NSPopUpButton *)sender {
      if ([sender.titleOfSelectedItem isEqualToString:@"Wein"]) {
        [label setStringValue: @"Alkohol"]
      } else if ...
    } 
     
  5. MacApple

    MacApple Schmalzprinz

    Dabei seit:
    05.01.04
    Beiträge:
    3.582
    Das Thema kommt mir doch bekannt vor. Genau, im OS X Entwicklerforum hat man dir ja schon versucht zu helfen.
    Nun, wenn ich mir deinen Code anschaue, dann habe ich den Eindruck, dass du dir die Grundlagen der objektorientierten Programmierung noch mal anschauen solltest.
    Mit ein paar kleinen Änderungen an deinem Code oben ist das Ziel schnell erreicht:
    Code:
    - (IBAction)update:(NSMenuItem *)sender {
        [label setStringValue:sender.representedObject];
    }
    
    
    - (IBAction)add:(id)sender {
        // Neues Menü erzeugen
        NSMenu *myBibliothek = [[NSMenu alloc] init];
        NSMenuItem *menuItem;
    
        // Menüeinträge erstellen und konfigurieren
        menuItem = [myBibliothek addItemWithTitle:@"Wein" action:@selector(update:) keyEquivalent:@""];
        menuItem.target = self;
        menuItem.representedObject = @"Alkohol";
    
        menuItem = [myBibliothek addItemWithTitle:@"Bier" action:@selector(update:) keyEquivalent:@""];
        menuItem.target = self;
        menuItem.representedObject = @"Alkohol";
    
        menuItem = [myBibliothek addItemWithTitle:@"Wasser" action:@selector(update:) keyEquivalent:@""];
        menuItem.target = self;
        menuItem.representedObject = @"Okay";
    
        popUp.menu = myBibliothek;
    }
    Tue dir aber selbst einen Gefallen und kopiere den Code nicht einfach, sondern nimm die Dokumentation zur Hand und verstehe was da passiert.
     
  6. OSX Phil

    OSX Phil Erdapfel

    Dabei seit:
    24.05.16
    Beiträge:
    4
    Meine App hat verschiedene NSTextfelder. Wie kann man den Fokus auf ein NSTextField festlegen? Also das Eingabefeld für den Anwender quasi vorselektieren. Mit ...Respond wird gleichzeitig die Verarbeitungsabfolge geändert, das möchte ich nicht.

    Vielen Dank
     
  7. OSX Phil

    OSX Phil Erdapfel

    Dabei seit:
    24.05.16
    Beiträge:
    4
    Danke MacApple.

    Meine Lösung sieht nun folgendermaßen aus:
    1. Textfeld setEnabled:Yes
    2. Textfeld becomeFirstResponder

    Ist dies so okay oder gibt es eine elegantere Lösung?
     
  8. MacApple

    MacApple Schmalzprinz

    Dabei seit:
    05.01.04
    Beiträge:
    3.582
    Nein, das ist nicht richtig. Du musst schon die Dokumentation lesen, die ich verlinkt habe.