2011-12-28 3 views
4

Я воссоздаю какой-то UIAlertView, свойственный моему приложению, поэтому я подклассифицирую UIWindow, чтобы сделать это. Окно добавляется к [UIApplication sharedApplication].windows, но на самом деле его не показывают. Я подрезал его вниз к этой небольшой кусок кода:UIWindow's makeKeyAndVisible не играет хорошо с ARC

UIWindow *testWindow = [[UIWindow alloc] initWithFrame:self.view.bounds]; 
testWindow.backgroundColor = [UIColor blueColor]; 
[testWindow makeKeyAndVisible]; 

Когда я вхожу [UIApplication sharedApplication].windows, я вижу:

"<UIWindow: 0x83774f0; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x8377660>>", 
"<UIWindow: 0x8382630; frame = (0 0; 300 400); layer = <UIWindowLayer: 0xf573e60>>" 

И еще, что второе окно с синим цветом фона является nowehere видно.

ОБНОВЛЕНИЕ: это кажется проблемой только при включенном ARC. Я создал 2 новых проекта «единого вида», один с включенным ARC, а другой с отключенным ARC. Оба идентичны, и я добавляю код UIWindow в viewDidAppear: главного контроллера. Когда я запускаю приложения в симуляторе, синее окно появляется только в проекте с отключенным ARC. Похоже, что ARC слишком быстро избавляется от моего UIWindow, поэтому у него даже нет времени, чтобы появиться. Сделать это __strong не помогло. Тем не менее невежественные ...

ответ

11

Похоже, ARC избавляется от моего UIWindow слишком быстро, и поэтому даже не было времени, чтобы показать вверх. Сделать это __strong не помогло.

Что делает __strong? Переменная, указанная в вашем вопросе, является локальной переменной, которая существует только до тех пор, пока метод не вернется. Когда метод возвращается, переменная уходит, поэтому ничего не принадлежит окну, поэтому он будет освобожден.

Назначьте указатель окна переменной экземпляра __strong или strong. Тогда у вас будет более продолжительное владение, сохранившее окно. Установите ivar или свойство в nil после того, как вы отпустите окно.

Как примечание, вы уверены, что хотите, чтобы это был подкласс UIWindow, а не UIView? Даже UIAlertView - это вид, а не окно. Если он создает свое собственное окно, вы можете это сделать - иметь представление, создающее собственное окно в качестве детали реализации.

+0

Это отвечает на множество вопросов, спасибо! – samvermette

+4

Как вы рекомендовали, я превратил его в подкласс UIView, который, в свою очередь, создает собственный UIWindow. Придавая этому окну сильное свойство, я уверен, что окно сохраняется, отображается и удаляется, когда я устанавливаю его на нуль. Теперь благодаря вам ARC имеет больше смысла! – samvermette

0
  1. Документы упомянуть, что вы должны использовать UIScreen для определения границ: [[UIScreen mainScreen] bounds]
  2. Я не уверен, что это необходимо, но вы не добавляя UIView в окно.
  3. Я заметил opaque = NO - попробуйте [window setOpaque:NO]; или что-то подобное.
  4. Я проверил ваш код и получил:

    окна приложений, как ожидается, иметь контроллер представления корня в конце запуска приложения

    Так в основном, используют [window setRootViewController:...];. Не спрашивайте меня, почему это мне не кажется нужным.

+0

Не повезло :(обновил мой оригинальный вопрос с кодом. – samvermette

+0

Еще ничего :( – samvermette

+0

...и снова :-) На этот раз он должен помочь –

Смежные вопросы