在quit上使用modalWindow时如何处理NSButton lockFocus上的断言失败?

时间:2010-08-02 15:35:15

标签: cocoa modal-dialog nsbutton

windowA 中的按钮IBAction调用runModalForWindow:windowB

windowB 成为键和模态。

windowB 有一个popUpWindowDatePicker,在显示时会调用stopModal,然后popUpWindowDatePicker变为键,而 windowB 会重置键,而不是模态的。此时没有窗口是模态的。

当popUpWindowDatePicker被解除时,其didResignFirstResponder方法将布尔值设置为YES。 windowB 然后变为键, windowB 的windowController windowDidBecomeKeyNotification触发,检查布尔值,如果是,则调用runModalForWindow:self.window

现在 windowB 是模态和密钥。 windowA 仍处于打开状态,但不是密钥。

windowB 有Okay和Cancel按钮调用: windowB 上的[NSApp stopModalWithCode:returnCode]然后orderOut:close

如果使用popUpWindowDatePicker,然后 windowB 关闭,Okay或Cancel之后的任何时间,将调用涉及Okay或Cancel按钮的Assertion Failure:< / p>

*** 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,则没有断言失败。

似乎 windowB 上的序列runModal-stopModal-runModal-stopModal与按下的按钮上的lockFocus失败有关,但是我无法找到一种方法来追踪更多来解决此问题这个问题。

任何人都可以提供任何提示或想法吗?

4 个答案:

答案 0 :(得分:2)

我在使用大量文本绘制NSTextView时遇到了类似的问题。解决此消息以及与“失去焦点”或调用“错误对象”相关的其他崩溃的原因是:从核心动画层中删除对象(以及它可能拥有的任何子对象)。

要在我的NSTextView上执行此操作,我在UIbuilder上轻松取消选中任何动画,在实用工具面板中对应于核心动画层的最后一个选项卡。

希望它有所帮助,

答案 1 :(得分:0)

我遇到了类似的问题,这里是我的日志:

* 断言失败 - [NSSecureTextField lockFocus],/ SourceCache / AppKit / AppKit-1038.36 / AppKit.subproj / NSView.m:5237

[13755:903] unlockFocus调用了太多时间。

[13755:903] unlockFocus调用了太多时间。

[13755:903] - [NSSecureTextField(0x100514b80)lockFocus]失败,窗口= 0x1005298d0,windowNumber = 714,[self isHiddenOrHasHiddenAncestor] = 1

这似乎是狮子会OS X之前的错误,因为我已经升级到Lion,它已经消失了...... 我猜它发生在未定义的showModal序列(在我的情况下是NSMenu)和NSWindow orderOut之后的某个程序执行点。在该应用程序继续工作,但变得不稳定之后,可以停止检查计时器,或者UI停止重绘(但仍然有效)。

答案 2 :(得分:0)

这里有类似的问题。我的问题是我的项目(tableView)失去了焦点。我所做的是将tableView指定为firstReponder,以便再次获得焦点。

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

希望这会对某人有所帮助。

答案 3 :(得分:0)

我添加了canDraw方法以确保lockFocus可用。这解决了我的问题。