2009-05-14 9 views
2

Je veux obtenir les dimensions de l'écran principal, donc j'utiliser cet extrait:Dans quelles circonstances [[NSScreen mainScreen] visibleFrame] renvoie-t-il une valeur nulle?

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

Il est l'impression

mainScreen frame = (null) 

Auparavant, il imprimait les dimensions attendues de mon moniteur principal.

Quelles sont les causes possibles de cela?

+0

Je serais également intéressé à le savoir. J'ai eu des résultats similaires avec [UIApplication sharedApplication] .keyWindow – Coocoo4Cocoa

+0

La situation que vous rencontrez n'est probablement pas la même que celle de Steve. Il existe des scénarios documentés dans lesquels keyWindow renverra zéro: http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/NSApplication/keyWindow Êtes-vous frappiez peut-être le scénario décrit là: « Cette méthode pourrait revenir à zéro si le fichier nib de l'application n'a pas encore terminé le chargement ou si le récepteur n'est pas actif. » ? – danielpunkass

+1

Ceci demande juste une blague "allumer l'écran principal". – Powerlord

Répondre

9

le problème ici est que vous êtes en cours d'exécution contre un des relativement peu de non-objets en Objective-C Programmation Cocoa.

Le résultat de "visibleFrame" est une structure NSRect , pas un objet. Pour l'obtenir pour afficher de façon significative dans la ligne NSLog, vous devez faire quelque chose comme ceci:

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

Il y a des fonctions d'assistance pour convertir un grand nombre de ces objets de structure à cordes et à l'arrière, par exemple NSStringFromPoint, NSStringFromRange, etc.

+0

Ah merci, je me sens assez bête maintenant je me rends compte de ce que j'ai fait. Je suis encore débutant chez Objective-C. –

+0

Il faut un certain temps avant que toutes les exceptions aux règles ne tombent et deviennent une seconde nature. Vous y arriverez! – danielpunkass

1

-visibleFrame renvoie une structure NSRect lorsque vous utilisez un spécificateur de chaîne pour un objet. Vous devez utiliser la fonction NSStringFromRect() (je crois que ça s'appelle) pour transformer le rect en objet chaîne pour NSLog().

2

La documentation à ce sujet doit être lue attentivement. L '"écran principal", tel qu'Apple le définit, n'est pas nécessairement l'écran avec la barre de menu. L'écran principal est l'écran qui reçoit les événements du clavier. Si, pour une raison quelconque, le système d'exploitation pense qu'aucun écran n'a le focus sur le clavier, je pourrais comprendre pourquoi mainScreen retournerait NULL.

Pour obtenir l'écran avec la barre de menus (et l'origine (0,0)) vous devez utiliser:

[[NSScreen screens] objectAtIndex:0] 

Je ne l'ai jamais vu ce NULL de retour, bien que je ne dirai pas que ça ne peut pas arriver.

+0

Ce n'est même pas nécessairement celui qui reçoit les événements clavier. C'est l'écran avec la fenêtre principale dessus. (La fenêtre recevant les événements clavier est la fenêtre clé, et peut être séparée de la fenêtre principale - par exemple, il peut s'agir d'un panneau flottant.) –

+0

Je pense qu'une fenêtre flottante avec le focus du clavier en ferait l'écran principal, même si la fenêtre principale est sur l'écran 0 du tableau d'écrans. Je soulignais simplement que l'écran principal n'est peut-être pas ce que j'avais supposé à l'origine jusqu'à ce que je lise les documents. D'autres peuvent faire la même erreur. Mon code qui a fait cette erreur est gravé sur des milliers de CD à travers le monde. – Mark

0

Vous essayez de vous connecter un objet, mais la méthode ne retourne pas un objet, il est de retour d'une struct.

Bien que NSStringFromRect vous aidera à l'exploitation forestière, il est probable que vous voulez que les entiers réels ailleurs.

Vous pouvez accomplir à la fois avec:

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