解锁焦点调用了太多次



我单击位于我的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];
    });

最新更新