NSPanel 导致后续使用 NSOpenPanel 产生异常
NSPanel causes subsequent use of NSOpenPanel to generate an exception
我有一个使用 NSOpenPanel 的应用程序,这样用户就可以 select 导入多个文件,并且还有一个典型的首选项面板。首选项面板存储在 .xib
文件中。
用户调用首选项面板后出现问题。在此之前,NSOpenPanel 工作得非常好,所有逻辑都在完成块中执行,并且可以一次又一次地重新调用。但是,一旦用户选择了首选项选项并取消了 sheet,那么随后对 -(IBAction)addFiles:
的每次调用都会导致异常:
它们是这样声明的:
@interface BQSAppDelegate
{
NSOpenPanel *addFilesPanel;
}
@property(assign)IBOutlet NSPanel*prefs_panel; //connected to a NSPanel in the .xib
并使用:
@implementation BQSAppDelegate
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// other initialisations not to do with addFilesPanel….
addFilesPanel = [NSOpenPanel openPanel];
addFilesPanel.canChooseDirectories = YES;
addFilesPanel.allowsMultipleSelection = YES;
}
-(IBAction)addFiles:(id)sender //button on main window pressed
{
[addFilesPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if (addFilesPanel.URLs.count < 1 || result != NSFileHandlingPanelOKButton) {
NSLog(@“User cancelled”);
[addFilesPanel orderOut:self]; //I’ve tried it without this line with exactly the same results
}
else {
//do things…
}
}];
}
-(IBAction)preferences:(id)sender //bound to the usual Apple+’,” shortcut and app menu item
{
if (self.prefs_panel.isVisible) {
return;
}
[self.window beginSheet:self.prefs_panel completionHandler:^(NSModalResponse returnCode) {
NSLog(@"completed"); //is never executed...
}];
}
-(IBAction)ok_prefs:(id)sender //called when the user presses a button on the Preference panel
{
[self.prefs_panel orderOut:self];
}
例外情况是:
2015-03-18 20:35:29.913 QS[3634:241869] *** Assertion failure in void associateSheetWithHost(NSWindow *, NSWindow *)(), /SourceCache/ViewBridge/ViewBridge-103/ViewBridgeUtilities.m:83
2015-03-18 20:35:29.914 QS[3634:241869] sheet <NSVBOpenPanel: 0x1003504f0> already has a host <NSWindow: 0x6000001e5e00>
2015-03-18 20:35:29.917 QS[3634:241869] (
0 CoreFoundation 0x00007fff95e7366c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff8db6776e objc_exception_throw + 43
2 CoreFoundation 0x00007fff95e7344a +[NSException raise:format:arguments:] + 106
3 Foundation 0x00007fff9399e471 -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 169
4 ViewBridge 0x00007fff8c931333 -[NSWindow(ViewBridgeNeedsSPI) _setSheetHost:] + 305
5 AppKit 0x00007fff8b367a2f -[NSVBSavePanel beginSheetModalForWindow:completionHandler:] + 69
6 QS 0x0000000100017684 -[BQSAppDelegate addFolders:] + 212
7 libsystem_trace.dylib 0x00007fff8be72cd7 _os_activity_initiate + 75
8 AppKit 0x00007fff8acd8b71 -[NSApplication sendAction:to:from:] + 452
9 AppKit 0x00007fff8acd8970 -[NSControl sendAction:to:] + 86
10 AppKit 0x00007fff8aeae86c __26-[NSCell _sendActionFrom:]_block_invoke + 131
11 libsystem_trace.dylib 0x00007fff8be72cd7 _os_activity_initiate + 75
12 AppKit 0x00007fff8ad21509 -[NSCell _sendActionFrom:] + 144
13 libsystem_trace.dylib 0x00007fff8be72cd7 _os_activity_initiate + 75
14 AppKit 0x00007fff8ad3c085 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2775
15 AppKit 0x00007fff8ad3b2b9 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 491
16 AppKit 0x00007fff8ad3a899 -[NSControl mouseDown:] + 714
17 AppKit 0x00007fff8b238a18 -[NSWindow _reallySendEvent:] + 12721
18 AppKit 0x00007fff8acbf16e -[NSWindow sendEvent:] + 446
19 AppKit 0x00007fff8ac71451 -[NSApplication sendEvent:] + 4183
20 AppKit 0x00007fff8aafd608 -[NSApplication run] + 711
21 AppKit 0x00007fff8aae8a14 NSApplicationMain + 1832
22 QS 0x0000000100001fe2 main + 34
23 libdyld.dylib 0x00007fff90d485c9 start + 1
这一定与我调用 and/or 关闭 NSPanel 的方式有关,但我不知道是什么。非常感谢您的帮助。
这是一条神秘的错误消息,尽管评论解决了问题,但我不确定我是否理解它的措辞。我认为它与 sheet 相关联的模态 运行 循环有关,并且 可能 与此有关——也许所有除非您调用 endSheet
.
,否则模态会话的开销仍然在某处活跃着
提示来自 this related question about the completion handler not being invoked. 第二个未被接受的答案似乎表明您必须终止模态会话,而不仅仅是终止 sheet。
我有一个使用 NSOpenPanel 的应用程序,这样用户就可以 select 导入多个文件,并且还有一个典型的首选项面板。首选项面板存储在 .xib
文件中。
用户调用首选项面板后出现问题。在此之前,NSOpenPanel 工作得非常好,所有逻辑都在完成块中执行,并且可以一次又一次地重新调用。但是,一旦用户选择了首选项选项并取消了 sheet,那么随后对 -(IBAction)addFiles:
的每次调用都会导致异常:
它们是这样声明的:
@interface BQSAppDelegate
{
NSOpenPanel *addFilesPanel;
}
@property(assign)IBOutlet NSPanel*prefs_panel; //connected to a NSPanel in the .xib
并使用:
@implementation BQSAppDelegate
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// other initialisations not to do with addFilesPanel….
addFilesPanel = [NSOpenPanel openPanel];
addFilesPanel.canChooseDirectories = YES;
addFilesPanel.allowsMultipleSelection = YES;
}
-(IBAction)addFiles:(id)sender //button on main window pressed
{
[addFilesPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if (addFilesPanel.URLs.count < 1 || result != NSFileHandlingPanelOKButton) {
NSLog(@“User cancelled”);
[addFilesPanel orderOut:self]; //I’ve tried it without this line with exactly the same results
}
else {
//do things…
}
}];
}
-(IBAction)preferences:(id)sender //bound to the usual Apple+’,” shortcut and app menu item
{
if (self.prefs_panel.isVisible) {
return;
}
[self.window beginSheet:self.prefs_panel completionHandler:^(NSModalResponse returnCode) {
NSLog(@"completed"); //is never executed...
}];
}
-(IBAction)ok_prefs:(id)sender //called when the user presses a button on the Preference panel
{
[self.prefs_panel orderOut:self];
}
例外情况是:
2015-03-18 20:35:29.913 QS[3634:241869] *** Assertion failure in void associateSheetWithHost(NSWindow *, NSWindow *)(), /SourceCache/ViewBridge/ViewBridge-103/ViewBridgeUtilities.m:83
2015-03-18 20:35:29.914 QS[3634:241869] sheet <NSVBOpenPanel: 0x1003504f0> already has a host <NSWindow: 0x6000001e5e00>
2015-03-18 20:35:29.917 QS[3634:241869] (
0 CoreFoundation 0x00007fff95e7366c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff8db6776e objc_exception_throw + 43
2 CoreFoundation 0x00007fff95e7344a +[NSException raise:format:arguments:] + 106
3 Foundation 0x00007fff9399e471 -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 169
4 ViewBridge 0x00007fff8c931333 -[NSWindow(ViewBridgeNeedsSPI) _setSheetHost:] + 305
5 AppKit 0x00007fff8b367a2f -[NSVBSavePanel beginSheetModalForWindow:completionHandler:] + 69
6 QS 0x0000000100017684 -[BQSAppDelegate addFolders:] + 212
7 libsystem_trace.dylib 0x00007fff8be72cd7 _os_activity_initiate + 75
8 AppKit 0x00007fff8acd8b71 -[NSApplication sendAction:to:from:] + 452
9 AppKit 0x00007fff8acd8970 -[NSControl sendAction:to:] + 86
10 AppKit 0x00007fff8aeae86c __26-[NSCell _sendActionFrom:]_block_invoke + 131
11 libsystem_trace.dylib 0x00007fff8be72cd7 _os_activity_initiate + 75
12 AppKit 0x00007fff8ad21509 -[NSCell _sendActionFrom:] + 144
13 libsystem_trace.dylib 0x00007fff8be72cd7 _os_activity_initiate + 75
14 AppKit 0x00007fff8ad3c085 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2775
15 AppKit 0x00007fff8ad3b2b9 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 491
16 AppKit 0x00007fff8ad3a899 -[NSControl mouseDown:] + 714
17 AppKit 0x00007fff8b238a18 -[NSWindow _reallySendEvent:] + 12721
18 AppKit 0x00007fff8acbf16e -[NSWindow sendEvent:] + 446
19 AppKit 0x00007fff8ac71451 -[NSApplication sendEvent:] + 4183
20 AppKit 0x00007fff8aafd608 -[NSApplication run] + 711
21 AppKit 0x00007fff8aae8a14 NSApplicationMain + 1832
22 QS 0x0000000100001fe2 main + 34
23 libdyld.dylib 0x00007fff90d485c9 start + 1
这一定与我调用 and/or 关闭 NSPanel 的方式有关,但我不知道是什么。非常感谢您的帮助。
这是一条神秘的错误消息,尽管评论解决了问题,但我不确定我是否理解它的措辞。我认为它与 sheet 相关联的模态 运行 循环有关,并且 可能 与此有关——也许所有除非您调用 endSheet
.
提示来自 this related question about the completion handler not being invoked. 第二个未被接受的答案似乎表明您必须终止模态会话,而不仅仅是终止 sheet。