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

windowA中按钮的IBAction调用runModalForWindow:windowB.

windowB成为键和模态.

windowB有一个popUpWindowDatePicker,它在显示时调用stopModal,然后popUpWindowDatePicker变为key,windowB会调用key而不是modal.此时没有窗口是模态的.

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

现在windowB是模态和键. windowA仍然是开放的,但不是关键.

windowB有Okay和Cancel按钮,它们调用:
[NSApp stopModalWithCode:returnCode]然后orderOut:并关闭windowB.

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

*** 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

如果使用Okay或Cancel关闭windowB并且未使用popUpWindowDatePicker,则没有断言失败.

似乎windowB上的序列runModal-stopModal-runModal-stopModal参与了按下按钮时lockFocus的失败,但是我找不到一种方法来追踪更多来解决这个问题.

谁能提供任何提示或想法?

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

要在我的NSTextView上执行此操作,我在UIbuilder上轻松取消选中任何动画,实用工具面板中与Core Animation Layer对应的最后一个选项卡.

希望能帮助到你,

点赞