2012-03-15 2 views
0

Когда я открываю NSWindow, который автореализован, все работает правильно. NSWindow выпущен моим корневым классом только после того, как я нажал кнопку «ОК».Избегайте автоопределения NSWindow, который открывает другой NSWindow?

Однако, когда я открываю NSWindow и с открытого NSWindow, я открываю новый NSWindow, я получаю плохую ошибку доступа. Это происходит потому, что первое окно больше не считается активным и освобождается корневым классом.

Как я могу избежать этой проблемы?

+0

Возможно, в вашем Атрибуте проверен инспектор «Освобождение при закрытии»? –

+0

@ Justin Boo Нет, это не так. – aneuryzm

ответ

1

Простой ответ: не делайте этого, вы полагаетесь на неопределенное поведение и просите об аварии. Вы должны прочно ссылаться на окно и только отпустить его, когда закончите с окном.

В общем, вы должны использовать NSWindowController для управления каждым открываемым окном. NSWindowController содержит ссылку на окно, и вы можете легко вызвать методы showWindow: и close:NSWindowController для управления отображением окна.

С вашего вопроса кажется, что вы используете NSWindow объекты в качестве оконных контроллеров. Это не то, как вы должны использовать NSWindow. Вместо этого используйте NSWindowController, вот для чего это.

+0

Это ясно. Только одно: каков правильный способ освободить NSWindowController из основного документа после того, как вы закроете его окно? В других терминах у меня теперь есть сильная ссылка, но я не уверен, что я должен отправить уведомление от NSWindowController, которое закрывает его окно, в документ, чтобы сообщить документу о выпуске оконного контроллера – aneuryzm

+1

Если вы считаете, что может отображать окно снова, тогда нет необходимости избавляться от оконного контроллера. Ленько загружайте его так, чтобы он выделял только тогда, когда вам это нужно, а затем просто оставляйте его инициализированным. Затем вы можете легко открыть и закрыть окно. Если вы должны освободить его, тогда зарегистрируйте свой регистр документа для уведомления NSWindowWillCloseNotification с нолем, а затем, когда будет получено уведомление, проверьте, является ли это оконным контроллером окна, и если это так, отпустите оконный контроллер. –

+0

Спасибо за неполный ответ – aneuryzm

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