Закрытие NSWindow - PullRequest
       5

Закрытие NSWindow

2 голосов
/ 04 марта 2010

У меня есть NSWindow, в котором размещается WebView, который я подключил к обработчику сценариев.

Теперь, когда пользователь нажимает кнопку на элементе управления в WebView, он вызывает метод Objective C для моего объекта.

В этом конкретном случае действие кнопки состоит в том, чтобы попытаться закрыть окно, в котором размещен WebView

[[окно веб-просмотра] закрыть];

Обычно это работает, но иногда я получаю SEGFAULT или какое-либо другое нарушение прав доступа в результате цикла событий, пытающегося отправить сообщение мыши в теперь уничтоженное представление.

Callstack ужасен, когда я пытаюсь закрыть окно, четный цикл вызвал окно, вызвал webView, вызвал мой делегат скрипта, когда я пытаюсь закрыть окно. Уничтожение объекта от обратного вызова этого объекта, как правило, опасно, но я не могу понять, как окна должны безопасно закрываться в результате взаимодействия пользователей с представлениями о них.

Ответы [ 3 ]

5 голосов
/ 04 марта 2010

Нужно закрыть, не можете ли вы попробовать API

- (void)orderOut:(id)sender

, просто проверьте, видно ли ваше окно, и закажите это окно

if([[webView window] isVisible])
   [[webView window] orderOut:self];
2 голосов
/ 04 марта 2010

Callstack ужасен, когда я пытаюсь закрыть окно, четный цикл вызвал окно, вызвал webView, вызвал мой делегат скрипта, когда я пытаюсь закрыть окно. Уничтожение объекта от обратного вызова этого объекта, как правило, опасно, но я не могу понять, как следует безопасно закрывать окна в результате взаимодействия пользователей с представлениями о них.

Вы можете использовать performSelector:withObject:afterDelay:, чтобы отложить закрытие окна на 0,0 секунд после нажатия кнопки.

В этом конкретном случае действие кнопки состоит в том, чтобы попытаться закрыть окно, в котором размещен WebView

[[webView window] close];

Обычно это работает, но иногда я получаю SEGFAULT или какое-либо другое нарушение прав доступа в результате цикла событий, пытающегося отправить сообщение мыши в теперь уничтоженное представление.

Это маловероятно. Цикл событий будет отправлять событие только для существующего окна; если вы закрыли и тем самым уничтожили окно, ни одно событие не может прийти ни к этому окну, ни к любому виду, который когда-то был в нем.

Было бы полезно, если бы вы отредактировали свой вопрос, чтобы включить трассировку стека для этого сбоя.

0 голосов
/ 27 июля 2014

Я знаю, что это старый вопрос, но у меня похожая проблема, и я подозреваю, что в принятом ответе упущен смысл. Я полагаю, что окно, в котором размещается WebView, по-прежнему является одним или несколькими делегатами WebView, и методы делегатов вызываются после завершения загрузки WebView, то есть после закрытия окна.

Я искал правильный способ решить эту проблему ... Я буду продолжать искать. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...