При каких обстоятельствах [[NSScreen mainScreen] visibleFrame] возвращает ноль? - PullRequest
2 голосов
/ 14 мая 2009

Я хочу получить размеры основного экрана, поэтому я использую этот фрагмент:

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

Это печать

mainScreen frame = (null)

Ранее он печатал ожидаемые размеры моего основного монитора.

Каковы возможные причины этого?

Ответы [ 4 ]

9 голосов
/ 14 мая 2009

проблема здесь в том, что вы столкнулись с одним из относительно немногих не-объектов в программировании Какао Objective-C.

Результатом «visibleFrame» является структура NSRect , а не объект. Чтобы оно отображалось в строке NSLog, вам нужно сделать что-то вроде этого:

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

Существуют вспомогательные функции для преобразования многих из этих структурных объектов в строки и обратно, например, NSStringFromPoint, NSStringFromRange и т. Д.

2 голосов
/ 14 мая 2009

Документация по этому вопросу должна быть внимательно прочитана. «Основной экран», как его определяет Apple, не обязательно является экраном со строкой меню. «Главный экран» - это экран, который принимает события клавиатуры. Если по какой-то причине ОС считает, что ни один экран не имеет фокусировки клавиатуры, я могу понять, почему mainScreen будет возвращать NULL.

Чтобы получить экран со строкой меню (И начало координат в (0,0)), вам необходимо использовать:

[[NSScreen screens] objectAtIndex:0]

Я никогда не видел этот возврат NULL, хотя я не скажу, что это не может произойти.

1 голос
/ 14 мая 2009

-visibleFrame возвращает структуру NSRect, пока вы используете строковый спецификатор для объекта. Вам нужно использовать функцию NSStringFromRect () (я считаю, что она вызывается), чтобы превратить прямоугольник в строковый объект для NSLog ().

0 голосов
/ 20 марта 2015

Вы пытаетесь зарегистрировать объект, но метод не возвращает объект, он возвращает структуру.

Несмотря на то, что NSStringFromRect поможет вам с ведением журнала, скорее всего, вам понадобятся настоящие целые числа в других местах.

Вы можете выполнить оба с:

NSLog(@"screen is %.2f wide and %.2f high", [[[NSScreen screens]     
objectAtIndex:0] visibleFrame].size.width,  [[[NSScreen screens] 
objectAtIndex:0] visibleFrame].size.height);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...