2014-12-30 3 views
0

я нажимаю на NSButton (openPane л), который расположен на главном окне моего OS X приложение, чтобы показать NSPanel (myPanel), используя следующий метод:unlockFocus называют слишком много раз

- (IBAction)openPanel:(id)sender { 
    [_myPanel makeKeyAndOrderFront:nil]; 
} 

Все работает, как и ожидалось, за исключением I получаем следующее описание в области отладки только в первый раз, когда я нажимаю на кнопку (openPanel):

"unlockFocus called too many times. Called on NSButton: 0x610000141080." 

атрибуты панели выбираются следующим образом:

Style: Utility Panel, 
Appearance:Title Bar and Shadow, 
Controls: Close, 
Behaviour: Restorable, 
Memory: Deferred 

Я просмотрел веб-страницы, но не могу найти объяснений. Кто-нибудь знает, почему это происходит или как его решить?

+0

я с аналогичной проблемой.(1) Использование раскадровки (2) Только происходит при первом нажатии кнопки - последующие - это нормально (3) Я использую кнопку, чтобы показать NSSavePanel через NSDocument. – Sam

ответ

0

Не уверен, что там происходит, но я хотел бы попробовать это, чтобы показать свои NSPanel:

-(IBAction)openPanel:(id)sender { 
[[NSApplication sharedApplication] beginSheet:_myPanel 
           modalForWindow:self.window 
           modalDelegate:self 
           didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
            contextInfo:nil]; 

Кроме того, вы должны убедиться, что Release при закрытом флажок установлен для NSPanel. Найдите его в интерфейсе Builder.

EDIT: Вы рисуете что-то на своем NSPanel? Установка NSColor или отображение NSImage? Я предполагаю, что вы показываете в NSImage и испортили что-то по поводу этого: Apple Doc: lockFocus

+0

благодарит за комментарии. Я изменяю цвет шрифта NSButton (openPanel) после того, как он щелкнул следующим образом: NSColor * color = [NSColor blackColor]; NSMutableAttributedString * colorTitle; NSRange titleRange; colorTitle = [[NSMutableAttributedString alloc] initWithAttributedString: [openPanel attribitedTitle]]; titleRange = NSMakeRange (0, [colorTitle length]); [colorTitle addAttribute: NSForegroundColorAttributeName value: color range: titleRange]; [openPanel setAttributedTitle: colorTitle]; – DORI

0

Я установил ту же самую проблему со следующим

В заголовке

@interface aWindowController : NSWindowController 
{ 
    /* other Vars */ 

    NSOpenPanel *panel; 
} 

В ом

- (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 очистит панель.

+0

IBACTION вызовите другой метод, чтобы открыть панель. – Rds

+2

С этим ответом возникают некоторые проблемы с форматированием, которые затрудняют чтение. – Ding

+0

Проблема заключается в Xcode 5 и Xcode 6, 10.8-10.10. Изменено поведение NSPanel. Чтобы исправить это, (1) НЕ использовать NSPanel, (2) объявить и инициализировать NSPANEL при инициализации Window Controller. Или в DidLoad от AppDelegate. Когда панель нужна, установите свойства и покажите панель. ARC очистит NSPanel при завершении приложения. – Rds

1

У меня была такая же проблема с использованием XCode 7.0 beta 6 с использованием раскадровки и segue для отображения листа. Кажется, что есть общая проблема, которая возникает, если вы открываете панель непосредственно из действия.

Чтобы решить эту проблему, просто откройте панель из основной очереди:

- (IBAction)openPanel:(id)sender { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [_myPanel makeKeyAndOrderFront:nil]; 
    }); 
} 

Это будет также решать подобные проблемы с быстрым и раскадровки. Используйте этот быстрый код для вызова SEGUE:

@IBAction func onButtonClicked(sender: AnyObject) { 
    dispatch_async(dispatch_get_main_queue(), { 
     self.performSegueWithIdentifier("identifier", sender: self); 
    }) 
} 
0

У меня была такая же проблема с NSPopUpButton, что называется Segue и @Flovdis ответ работал для меня.

Это объектный код C Я использовал:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"MySegue" sender:self]; 
    }); 
Смежные вопросы