Как обработать ошибку утверждения на NSButton lockFocus при использовании modalWindow при выходе? - PullRequest
4 голосов
/ 02 августа 2010

кнопка IBAction в окне A вызывает runModalForWindow:windowB.

windowB становится ключевым и модальным.

windowB имеет popUpWindowDatePicker, который вызывает stopModal при отображении, а затем popUpWindowDatePicker становится ключом, а windowB подает ключ и не является модальным.в этом месте нет модальных окон.

когда popUpWindowDatePicker закрывается, его метод didResignFirstResponder устанавливает логическое значение YES. windowB затем становится ключом, и windowB windowController windowDidBecomeKeyNotification запускает, проверяет логическое значение и, если это YES, вызывает runModalForWindow:self.window.

сейчас windowB является модальным и ключевым. windowA все еще открыто, но не клавиша.

windowB имеет кнопки Okay и Cancel, которые вызывают: [NSApp stopModalWithCode:returnCode], а затем orderOut: и close on windowB .

, если используется popUpWindowDatePicker, и затем в любое время после того, как windowB закрывается с помощью Okay или Cancel, вызывается ошибка подтвержденияс использованием кнопок Okay или Cancel:

*** Assertion failure in -[NSButton lockFocus], /SourceCache/AppKit/AppKit-1038.29/AppKit.subproj/NSView.m:5237

-[NSButton(0x20021cd60) lockFocus] failed with window=0x20021c0c0, windowNumber=-1, [self isHiddenOrHasHiddenAncestor]=0

, если windowB закрыто с помощью Okay или Cancel и popUpWindowDatePicker не использовался, ошибка подтверждения отсутствует.

itКажется, что последовательность runModal-stopModal-runModal-stopModal на windowB связана с отказом lockFocus на нажатой кнопке, но я не могу найти способ отследить больше, чем это, чтобы решить эту проблему.

Может кто-нибудь предложить какие-либо советы или мысли?

Ответы [ 4 ]

2 голосов
/ 06 февраля 2013

У меня была похожая проблема, когда я рисовал поверх NSTextView с большим количеством текста. Это сообщение и другие сбои, связанные с «потерей фокуса» или вызовом «неправильного объекта», были решены следующим образом: удалите объект (и любой его дочерний элемент) из основного слоя анимации.

Чтобы сделать это в моем NSTextView, я легко отключил его для любой анимации в UIbuilder, последней вкладке в панели утилит, соответствующей слою основной анимации.

Надеюсь, это поможет,

0 голосов
/ 04 декабря 2017

Я добавил canDraw метод, чтобы убедиться, что lockFocus доступен. Это решило проблему в моем случае.

0 голосов
/ 27 сентября 2012

Была похожая проблема здесь. Моя проблема заключалась в том, что мой элемент (tableView) потерял фокус. Что я сделал, так это назначил свой tableView как firstReponder, чтобы он снова получил фокус.

//...some code...
[self.searchTableView reloadData];
AGAppDelegate *del = [[NSApplication sharedApplication] delegate];
[del.window makeFirstResponder:self.searchTableView];

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 14 марта 2012

Я столкнулся с подобной проблемой, вот мои логи:

* Ошибка подтверждения в - [NSSecureTextField lockFocus], /SourceCache/AppKit/AppKit-1038.36/AppKit.subproj/NSView.m:5237

[13755: 903] unlockFocus вызывается слишком много раз.

[13755: 903] unlockFocus вызывается слишком много раз.

[13755: 903] - [NSSecureTextField (0x100514b80) lockFocus] не удалось с window = 0x1005298d0, windowNumber = 714, [self isHiddenOrHasHiddenAncestor] = 1

Кажется, это ошибка до Lion OS X, потому что после обновления до Lion она исчезла ... Я предполагаю, что это происходит после неопределенной последовательности showModal (NSMenu в моем случае) и NSWindow orderOut в некоторой точке выполнения программы. После этого приложение продолжает работать, но становится нестабильным, поскольку таймер проверки может быть остановлен или пользовательский интерфейс перестает перерисовываться (но все еще работает).

...