NSWindow Subclassen

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

  • NSWindow Subclassen

    Hey,
    ich bin Xcode Anfänger und kämpfe mich jetzt schon ein paar Tagen herum wie ich mein NSWindow Subclassen kann. Grund dafür ist das ich ein Fullscreen App gebaut habe wobei das Fenster

    Quellcode

    1. styleMask:NSBorderlessWindowMask
    erstelle. Zusätzlich hab ich noch ein WebView eingebaut, jedoch habe ich nun das Problem das ein NSBorderlessWindowMask kein Main bzw KeyWindow ist, somit sind auch alle Eingabegeräte geblockt... ich weis zwar das ich diese mit:

    Quellcode

    1. - (BOOL)canBecomeKeyWindow
    2. {
    3. return YES;
    4. }
    5. - (BOOL) canBecomeMainWindow
    6. {
    7. return YES;
    8. }
    wieder zum leben erwecken kann, jedoch in der Doku steht etwas von NSWindow Subclassen, wobei ich aber nicht weis wie das jetzt genau funktioniert, kann mir da jemand ein Tutorial geben, das ich mal nachmachen / bauen kann um das zu verstehen... Learning by Doing ist bei das beste zu verstehen als in Bücher zu kramen...

    hier mal mein Code:
    .h

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. #import <WebKit/WebKit.h>
    3. @interface TimeWarpAppDelegate : NSObject <NSApplicationDelegate> {
    4. NSWindow *window;
    5. IBOutlet WebView*webview;
    6. }
    7. @property (assign) IBOutlet NSWindow *window;
    8. @end
    Alles anzeigen


    dann das .m

    Quellcode

    1. #import "TimeWarpAppDelegate.h"
    2. @implementation TimeWarpAppDelegate
    3. @synthesize window;
    4. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    5. // Insert code here to initialize your application
    6. [webview setDrawsBackground:NO];
    7. [window orderOut:self];
    8. NSRect screenRect = [[NSScreen mainScreen] frame];
    9. NSView * iv = [window contentView];
    10. self.window = [[NSWindow alloc] initWithContentRect:screenRect
    11. //styleMask:NSTitledWindowMask
    12. styleMask:NSBorderlessWindowMask
    13. //styleMask:(NSUInteger)windowStyle
    14. backing:NSBackingStoreBuffered
    15. defer:NO screen:[NSScreen mainScreen]];
    16. [self.window setContentView:iv];
    17. [self.window setLevel:CGShieldingWindowLevel()];
    18. [self.window makeKeyAndOrderFront:self];
    19. NSURL*url=[NSURL URLWithString:@"http://localhost/"];
    20. NSURLRequest*request=[NSURLRequest requestWithURL:url];
    21. [[webview mainFrame] loadRequest:request];
    22. }
    23. @end
    Alles anzeigen


    Dann hab ich noch eine weitere Class angelegt: ActiveView die ich im IB als Class für das Fenster eingetragen habe.

    ActiveView.h

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. @interface ActiveView : NSWindow {
    3. }
    4. @end
    Alles anzeigen



    ActiveView.m

    Quellcode

    1. #import "ActiveView.h"
    2. #import <ApplicationServices/ApplicationServices.h>
    3. @implementation ActiveView
    4. - (BOOL)canBecomeKeyWindow
    5. {
    6. return YES;
    7. }
    8. - (BOOL) canBecomeMainWindow
    9. {
    10. return YES;
    11. }
    12. @end
    Alles anzeigen



    Funktionieren tut das jedoch nicht, das Window bleibt eingefrohren ohne Keydown funktion...
    Über stümperhafte Antworten in anderen Foren durfte ich mich schon freuen, daher hoffe ich das sich hier vl. jemand etwas zeit für mich nimmt...

    greetz Noli ;)
  • Hallo,

    Über stümperhafte Antworten in anderen Foren durfte ich mich schon freuen, daher hoffe ich das sich hier vl. jemand etwas zeit für mich nimmt...

    Wo hast Du noch gefragt ausser bei MacUser.de: macuser.de/forum/f25/osx-fullscreen-app-590248/

    Bei Dir fehlt es an Grundlagen, siehe MacUser.de:

    habs mal eigenmächtig damit versucht: styleMask:nil
    hat sogar geklappt ;) zwar mit Warning aber es geht Fullscreen auf... *Freu*


    ..das mit dem Speicherloch verstehe ich nicht ganz little_pixel ... ?


    Ich habe Dir geantwortet und geschrieben:

    Sein Setter wird mit -retain definiert sein, oder?

    Du erzeugst eine Fensterinstanz (RetainCount, 1), Du weißt sie Deinem Property zu (RC, 2).
    Beim -dealloc wirst Du wohl "[window release];" aufrufen (RC, 1).

    … und jetzt oxidiert das Ding weiter rum, da der RC nicht auf 0 fällt.

    Hier ein Beispiel:

    Quellcode

    1. // property "text" ist mit -retain definiert
    2. // 1 > OK
    3. NSString *string = [[NSString alloc] init];
    4. self.text = string;
    5. [string release];
    6. // 2 > OK
    7. NSString *string = [[[NSString alloc] init] autorelease];
    8. self.text = string;
    9. // 3 > OK
    10. self.text = [[[NSString alloc] init] autorelease];
    11. // 4 == 3 > OK
    12. self.text = [NSString string];
    13. // 5
    14. NSString *string = [[NSString alloc] init];
    15. self.text = string;
    16. // … wenn jetzt nichts mehr mit "string" passiert > Leak
    17. // 6
    18. self.text = [[NSString alloc] init];
    19. // … keine Möglichekt den RC zu balancieren > Leak
    Alles anzeigen
    Bei Deinem Window trifft Fall 6 zu.

    Viele Grüße


    Du hast es bis heute nicht geschafft Dein Speicherloch zu korrigieren.
    Tut mir leid, das ist so.

    Dann wird es mit weiteren Umsetzungen schwierig… :S

    Viele Grüße
  • nolis schrieb:

    Learning by Doing ist bei das beste zu verstehen als in Bücher zu kramen...

    Und was ist, wenn das in Büchern genau gemacht wird?

    Ich habe mal ne Klausur korrigiert. Glatte 5. Da rief der Student vor der Rückgabe an: "Herr Negm, was habe ich in der Klausur?"
    "Moment, ich schaue nach *Fahrstuhlmusik* Da war leider nicht viel zu tun. Das war ein klares Mangelhaft."
    "Das ist mein dritter Versuch gewesen. Ich muss die unbedingt bestehen."
    Da ich auch ernsthaftes Bemühen zählen lasse, wollte ich mir in Erinnerung rufen, wie der in der Vorlesung war.
    "Wo saßen Sie denn in der Vorlesung?"
    "Gar nicht, ich kann in Vorlesungen nicht lernen. Ich lerne lieber zu hause. Habe ich schon immer so gemacht."
    "Sie haben das schon immer so gemacht und sind damit zweimal durchgefallen!? Und Sie haben es dann auch in meiner Vorlesung wieder so gemacht!?!?!"
    "Ja!"
    "Es tut mir leid, aber ich sehe nicht, was ich an der Note machen könnte."

    Wieso fällt mir gerade diese Geschichte ein?
    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"?
  • little_pixel schrieb:

    Hallo,

    Über stümperhafte Antworten in anderen Foren durfte ich mich schon freuen, daher hoffe ich das sich hier vl. jemand etwas zeit für mich nimmt...

    Wo hast Du noch gefragt ausser bei MacUser.de: macuser.de/forum/f25/osx-fullscreen-app-590248/

    Er hat wieder dort gefragt: macuser.de/forum/f25/webview-startseite-590342/
    Toller Beitrag. :thumbup:

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

  • Manno, das hier ist aber nicht Uni und auch nicht Kindergarten und es gibt auch keine Benotungen oder ?

    Ich hab eine ziemlich konkrete Frage gestellt, und als Antwort bekomme ich nur "lies doch in Büchern nach".. OK wenn das die Antwort ist, wird es für mich als leihe wohl einfach zu kompliziert oder zu schwer sein das umzusetzten.

    Das Program weist weder einen Fehler noch ein Warning auf und funktioniert wunderbar, jedoch ist es für Eingaben einfach inaktiv...


    So wenn mir da jemand helfen kann, oder das einfach für mich fertig schreibt, bitte melden, ich bezahlt auch dafür !
  • Du willst nicht in die Fahrschule gehen, weil dir das zu kompliziert ist, aber willst wissen, wie man einen Panzer einparkt. Dir sagt jemand, dass Du erstmal auf der rechten Seite fahren sollst und Du jammerst rum dass Du noch nie ein Strafzettel bekommen hast und eigentlich nur den Panzer einparken willst.

    Ist das ein guter Vergleich?
    C++
  • Ich kann mir zwar auch nicht vorstellen, wie man von Code-Abtippen die Konzepte dahinter verstehen will, aber wenn Du das möchtest, hier einige Hinweise, wie Du vielleicht doch noch ein Tutorial findest:

    NSWindow kann man genau so ableiten wie jede andere Klasse auch. Und in der Cocoa-Welt ist eigentlich jede Klasse eine abgeleitete Klasse (meistens von NSObject). Sprich: Du schreibst einfach eine Klasse und gibst als Basisklasse NSWindow an.
    Multigrad - 360°-Produktfotografie für den Mac
  • wolf_10de schrieb:

    Hast du mal nen Link ??

    Jaja, jetzt willste meine Geheimquellen haben... war irgendwo auf YouTube, wo sonst könne man fundiert Programmieren lernen? Mir ist aufgefallen, dass alle qualitativ hochwertigen Tutorials mit "Wazzup?" anfangen :)

    Edit: Ich hab' eben tatsächlich mal in einige reingesehen, mannomann ist das unterirdisch. Danach wundert einen gar nichts mehr...
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    wolf_10de schrieb:

    Hast du mal nen Link ??

    Jaja, jetzt willste meine Geheimquellen haben... war irgendwo auf YouTube, wo sonst könne man fundiert Programmieren lernen? Mir ist aufgefallen, dass alle qualitativ hochwertigen Tutorials mit "Wazzup?" anfangen :)

    Edit: Ich hab' eben tatsächlich mal in einige reingesehen, mannomann ist das unterirdisch. Danach wundert einen gar nichts mehr...

    YouTube ?? mhh, hab ich schon mal gehört, muss ich mal beim Goggel suchen
    Danke für den Tipp!