2009-05-14 9 views
2

Ich mag die Abmessungen des Hauptbildschirms bekommen, so dass ich diesen Schnipsel:Unter welchen Umständen würde [[NSScreen mainScreen] visibleFrame] null zurückgeben?

NSLog(@"mainScreen frame = %@", [[NSScreen mainScreen] visibleFrame]); 

Es Druck

mainScreen frame = (null) 

Früher wurde die erwarteten Dimensionen meines Hauptmonitor zu drucken.

Was sind mögliche Ursachen dafür?

+0

ich auch diese daran interessiert zu wissen würde. Ich hatte ähnliche Ergebnisse mit [UIApplication sharedApplication] .keyWindow – Coocoo4Cocoa

+0

Die Situation, in die Sie geraten, ist wahrscheinlich nicht das gleiche wie das, was Steve sieht. Es gibt dokumentierte Szenarien, in denen keyWindow null zurückgibt: http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSApplication_Class/Reference/Reference.html#/apple_ref/occ/instm/NSApplication/keyWindow Treffen Sie vielleicht das dort beschriebene Szenario: "Diese Methode gibt möglicherweise nil zurück, wenn die NIB-Datei der Anwendung noch nicht vollständig geladen wurde oder wenn der Empfänger nicht aktiv ist." ? – danielpunkass

+1

Dies ist nur für einen "Hauptbildschirm einschalten" Witz. – Powerlord

Antwort

9

Das Problem hier ist, dass Sie gegen eine der relativ wenigen Nicht-Objekte in Objective-C Cocoa-Programmierung laufen. Das Ergebnis von "visibleFrame" ist ein NSRect Struktur, kein Objekt. Um es sinnvoll in der NSLog Linie angezeigt werden, haben Sie so etwas wie dies zu tun:

NSString* frameAsString = NSStringFromRect([[NSScreen mainScreen] visibleFrame]); 
NSLog(@"mainScreen frame = %@", frameAsString); 

Es gibt Hilfsfunktionen für viele dieser Strukturobjekte in Strings konvertiert und zurück, z.B. NSStringFromPoint, NSStringFromRange usw.

+0

Ah danke, ich fühle mich ziemlich albern jetzt merke ich was ich gemacht habe. Ich bin immer noch Anfänger bei Objective-C. –

+0

Es dauert eine Weile, bis alle Ausnahmen zu den Regeln hinzukommen und zur zweiten Natur werden. Du wirst dahin kommen! – danielpunkass

1

-visibleFrame gibt eine NSRect-Struktur zurück, während Sie einen String-Bezeichner für ein Objekt verwenden. Sie müssen die NSStringFromRect() -Funktion verwenden (ich glaube, es heißt), um das Rect in ein String-Objekt für NSLog() zu verwandeln.

2

Die Dokumentation dazu muss sorgfältig gelesen werden. Der "Hauptbildschirm", wie Apple ihn definiert, ist nicht unbedingt der Bildschirm mit der Menüleiste. Der "Hauptbildschirm" ist der Bildschirm, der Tastaturereignisse empfängt. Wenn das OS aus irgendeinem Grund denkt, dass keine Bildschirme den Tastaturfokus haben, dann könnte ich verstehen, warum mainScreen NULL zurückgibt.

Um den Bildschirm mit der Menüleiste (und Ursprung bei (0,0)) Sie verwenden müssen, erhalten:

[[NSScreen screens] objectAtIndex:0] 

ich nie diese Rückkehr NULL gesehen habe, obwohl ich nicht sagen, dass es kann nicht passieren.

+0

Es ist nicht einmal unbedingt derjenige, der Tastaturereignisse empfängt. Es ist der Bildschirm mit dem Hauptfenster darauf. (Das Fenster, das Tastaturereignisse empfängt, ist das Schlüsselfenster und kann vom Hauptfenster getrennt sein, z. B. kann es ein schwebendes Bedienfeld sein.) –

+0

Ich würde denken, dass ein schwebendes Fenster mit dem Tastaturfokus den Hauptbildschirm machen würde. auch wenn das Hauptfenster auf dem Bildschirm 0 von dem Bildschirm-Array ist. Ich habe nur darauf hingewiesen, dass der Hauptbildschirm möglicherweise nicht das war, was ich ursprünglich angenommen hatte, bis ich die Dokumente las. Andere können denselben Fehler machen. Mein Code, der diesen Fehler gemacht hat, ist auf Tausenden von CDs auf der ganzen Welt gebrannt. – Mark

0

Sie versuchen, ein Objekt zu protokollieren, aber die Methode gibt kein Objekt zurück, sondern gibt eine Struktur zurück.

Obwohl NSStringFromRect Ihnen bei der Protokollierung hilft, ist es wahrscheinlich, dass Sie die tatsächlichen Ganzzahlen woanders wollen.

können Sie erreichen beide mit:

NSLog(@"screen is %.2f wide and %.2f high", [[[NSScreen screens]  
objectAtIndex:0] visibleFrame].size.width, [[[NSScreen screens] 
objectAtIndex:0] visibleFrame].size.height); 
Verwandte Themen