我单击位于我的OS X应用程序主窗口上的NSButton (openPane
l)以使用以下方法显示NSPanel (myPanel
):
- (IBAction)openPanel:(id)sender {
[_myPanel makeKeyAndOrderFront:nil];
}
一切都按预期工作,除了我第一次单击按钮(openPanel)时在调试区域中得到以下描述:
"unlockFocus called too many times. Called on NSButton: 0x610000141080."
面板的属性选择如下:
Style: Utility Panel,
Appearance:Title Bar and Shadow,
Controls: Close,
Behaviour: Restorable,
Memory: Deferred
我浏览了网络,但找不到任何解释。有谁知道为什么会发生这种情况或如何解决?
XCode 7.0 beta 6 时遇到了同样的问题,使用故事板和 segue 来显示工作表。如果您直接从操作中打开面板,似乎会发生一些常见问题。
要解决此问题,只需从主队列中打开面板:
- (IBAction)openPanel:(id)sender {
dispatch_async(dispatch_get_main_queue(), ^{
[_myPanel makeKeyAndOrderFront:nil];
});
}
这也将解决 swift 和故事板的类似问题。使用此 swift 代码调用 segue:
@IBAction func onButtonClicked(sender: AnyObject) {
dispatch_async(dispatch_get_main_queue(), {
self.performSegueWithIdentifier("identifier", sender: self);
})
}
不确定那里发生了什么,但我会尝试这样做来显示您的 NSPanel:
-(IBAction)openPanel:(id)sender {
[[NSApplication sharedApplication] beginSheet:_myPanel
modalForWindow:self.window
modalDelegate:self
didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
contextInfo:nil];
此外,还应确保为 NSPanel 激活"关闭时释放"复选框。在界面生成器中搜索它。
编辑:你在NSPanel上画东西吗?设置一个 NSColor 或显示一个 NSImage ?我的猜测是你正在显示一个NSImage并搞砸了一些关于这个的东西:苹果文档:锁定焦点
我已经解决了以下相同的问题
在页眉中
@interface aWindowController : NSWindowController
{
/* other Vars */
NSOpenPanel *panel;
}
在 .m
- (void)windowDidLoad {
[super windowDidLoad];
/* other stuff */
/* set Panel Properties */
panel = [NSOpenPanel openPanel];
[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:NO];
[panel setAllowsMultipleSelection:YES];
}
在NSButton IBACTION中
- (IBAction)getFiles:(id)sender
{
NSArray *resultArry;
if([panel runModal] == NSFileHandlingPanelOKButton ){
resultArry = [panel URLs];
return resultArry;
}
return nil;
}
ARC 将清理面板。
我在调用Segue的NSPopUpButton上遇到了同样的问题,@Flovdis答案对我有用。
这是我使用的 Objective C 代码:
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:@"MySegue" sender:self];
});