NSStatusItem & NSTextField

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

  • NSStatusItem & NSTextField

    Hallo,

    Ich habe ein NSTextField in ein NSStatusItem gesetzt...nur bringe ich es nicht zusammen, dieses Textfield auch ändern zu können...ich habe eine Subklasse erstellt und setEditable auf YES gesetzt.

    Als makeFirstResponder habe ich das TextField auch gesetzt...

    Viele Grüße,
    KaboomProjeXs
    -Carpe Diem-
  • Hallo,

    genau. Das ist so nicht direkt möglich.

    Aber es ist dennoch gut zu lösen:

    - Du erzeugst ein StatusItem (mit einem eigenen View!)
    - Du ermittelst die Position des StatusItems (siehe a)
    - Du erzeugst ein transparentes Fenster und legst es über das StatusItem
    - Du beobachtest das StatusItem Window (das ist privat, aber beobachten darf man es) (siehe b)
    - wenn sich die Position des StatusItem Windows ändert, dann änderst Du Dein Fenster einfach entsprechend mit

    Viele Grüße

    a:

    Quellcode

    1. -(NSRect)frame
    2. {
    3. NSView *view = [self view];
    4. if(!view)
    5. {
    6. return NSZeroRect;
    7. }
    8. NSRect frame = [[view window] frame];
    9. // APPLE BUG
    10. // create status item > -frame origin.y in the same methode is the screen height
    11. NSScreen *primaryScreen = [NSScreen primaryScreen];
    12. if(!primaryScreen)
    13. {
    14. return frame;
    15. }
    16. NSStatusBar *systemStatusBar = [NSStatusBar systemStatusBar];
    17. CGFloat thickness = [systemStatusBar thickness];
    18. if([systemStatusBar isVertical])
    19. {
    20. // ERR
    21. return frame;
    22. }
    23. else
    24. {
    25. frame.origin.y = [primaryScreen frame].size.height - thickness;
    26. }
    27. return frame;
    28. }
    29. -(NSPoint)position
    30. {
    31. return [self frame].origin;
    32. }
    33. @end
    Alles anzeigen


    b:

    Quellcode

    1. [[[self.statusItem view] window] setDelegate:self];
    2. -(void)windowDidMove:(NSNotification*)nNotification
    3. {
    4. // StatusItem Window moved
    5. }
  • Anmerkung:

    Den Code aus a. machst Du einfach zu einer Kategorie von NSStatusItem. Brauch man endlos oft.
    -primaryScreen ist bei mir eine Methode aus einer Kategorie von NSScreen. Warum? Weil -mainScreen Dir nicht immer den Screen gibt, auf dem die Menüleiste ist (siehe Doku).
    Lösung ist, dass man sich alle Screens mit -screens geben lässt. In dem Array an Index 0 befindet sich immer der Screen, auf dem auch die Menüleiste ist.

    Viele Grüße
  • Anders, als das Fenster zu ersetzen, gibt es keine guten Optionen.
    Es gibt dazu noch (u.a.): Cocoabuilder (2004)
    und Matt Gemmel.

    Ich persönlich würde immer fragen, ob das wirklich, wirklich sein muss.
    Nicht alles was möglich ist, ist auch sinnvoll.

    Die nächste Frage wäre nämlich dann:
    "Meine App will den ganzen Bildschirm. wie bekomme ich die Menus weg?"

    little_pixel schrieb:


    …Brauch man endlos oft.

    Besser nicht.
    I would be embarrassed if they did not spy on me.
  • little_pixel schrieb:

    Den Code aus a. machst Du einfach zu einer Kategorie von NSStatusItem. Brauch man endlos oft.


    Besser nicht.

    Warum nicht?
    Die Position des StatusItems brauche ich und andere Entwickler nahezu immer. Sonst kann man gar kein InfoFenster einblenden.

    Viele Grüße


    Aus "endlos oft" und 'einblenden" schließe ich sofort auf: "endlos viele einblenden".
    Das wirkt dann wirklich schrottig, aber ich glaube, so meinst Du es nicht.

    Ich meine nur, dass man gerade bei globalen UI-Elementen sehr diszipliniert sein soll.
    Also ist das Info-Fenster für Dich dort wichtig?
    Oder siedelst Du Dich nicht gleich ganz besser in den Systemeinstellungen ein, so wie die meisten Menus das machen?

    Wenn das noch zunimmt, greifen vielleicht die Leute vom Mutterschiff ein.
    Und auf einmal hängen wir mit so etwas wie dem Ein-Fenster-Layout fest.
    I would be embarrassed if they did not spy on me.
  • Moment… Du (ich?) hast (habe) etwas missverstanden.

    Ich habe gesagt:

    Den Code aus a. machst Du einfach zu einer Kategorie von NSStatusItem. Brauch man endlos oft.

    Im Code, aus a., wird gezeigt, wie man die Position des StatusItems ermittelt.

    Diese Position brauch man sehr oft, da viele Anwendungen unter dem StatusItem ein Fenster anzeigen.

    Ich rede nicht davon, dass man oft ein Fenster über das StatusItem legt. :)

    Viele Grüße
  • KaboomProjeXs schrieb:

    Vielen Dank für die Hilfestellungen!
    Verzeiht mir, dass ich mich erst jetzt melde...Maturastress :P

    Ich verstehe nicht ganz was mir die Position des Statusitems bringen soll...ich will ja schließlich nur, dass ich das NSTextField editieren kann.


    Viele Grüße,
    KaboomProjeXs


    'little_pixel' hat das doch so genau beschriebn.
    Kurz: Es geht nicht so einfach.
    Aber Du besorgst Dir ein eigenes Fenster, mit dem es geht.
    Das muss halt nur dorthin gelangen, wo das "richtige", aber unfähige Fenster liegt, das man dafür unsichtbar macht.
    I would be embarrassed if they did not spy on me.
  • KaboomProjeXs schrieb:

    longW schrieb:

    Aber Du besorgst Dir ein eigenes Fenster, mit dem es geht.
    Das muss halt nur dorthin gelangen, wo das "richtige", aber unfähige Fenster liegt, das man dafür unsichtbar macht.

    Jetzt verstehe ich es ;) trotzdem muss das Fenster nur einmal dort hin und nicht ständig die Position aktualisiert werden...so habe ich das nämlich verstanden

    Sicher? Woher weißt du, was sich da tut?Was meinst du mit ständig?

    Dass man Systemeinträge hinzufügen, entfernen und sogar verschieben kann, ist dir bekannt?

    Bei little_Pixel handelt es sich um den gewissenhaftesten Mac-Programmierer den ich kenne. Ich denke, dass er alle Fälle durchdacht hat.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Sicher? Woher weißt du, was sich da tut?Was meinst du mit ständig?

    Dass man Systemeinträge hinzufügen, entfernen und sogar verschieben kann, ist dir bekannt?

    Ich mein ich verstehe jetzt, dass man ein nswindow subclassen und dieses dann über das vom statusitem legen muss, damit man darin dann einem textfield den focus geben kann, aber wofür die Positionsbestimmung?
    -Carpe Diem-
  • KaboomProjeXs schrieb:

    Amin Negm-Awad schrieb:

    Sicher? Woher weißt du, was sich da tut?Was meinst du mit ständig?

    Dass man Systemeinträge hinzufügen, entfernen und sogar verschieben kann, ist dir bekannt?

    Ich mein ich verstehe jetzt, dass man ein nswindow subclassen und dieses dann über das vom statusitem legen muss, damit man darin dann einem textfield den focus geben kann, aber wofür die Positionsbestimmung?

    Für das "über das vom Status-Item".
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Hallo,

    ich habe mal mein altes Test-Projekt in Xcode 4 zusammen kopiert.
    Als Anhang anbei.

    Funktioniert super (auch wenn das wirklich ein "dirty way" ist).
    Das besondere Ist jetzt im Prinzip, dass das TextField in Deinem Pseudo-StatusItem key werden kann, aber der Fokus der eigentlichen anderen App nicht verloren geht.

    Ist nur ein Beispiel. Bitte kontrolliere es selbst genau.

    Wichtig:
    Das StatusItem benötigt ein von Dir selbst erzeugtes View, auch wenn es als solches nicht benötigt wird.
    Aber sonst kommst Du nicht an das Fenster.

    Bei little_Pixel handelt es sich um den gewissenhaftesten Mac-Programmierer den ich kenne. Ich denke, dass er alle Fälle durchdacht hat.

    Amin, ich bin jetzt total verlegen…

    Viele Grüße