2015-01-05 3 views
1

Я использую приложение, управляемое меню, для доступа к различным типам символов и получения вышеуказанного сообщения об ошибке при первом выборе. Я получаю это сообщение только в первый раз. Я не пытаюсь разрешить это предупреждение, но не сообщение об убийстве приложения.Почему я получаю сообщение «Разблокировать фокус, используемое слишком много раз»?

отметить Есть 5 различных классов я получить доступ к

I доступ к различным наконечникам класса с помощью кнопок в коде моего appDelegate.m через код, как в следующем:

- (IBAction)btnShowPriceSource:(id)sender { 
    if (ps == nil){ 

     ps = [[PriceSource alloc] initWithWindowNibName:@"PriceSource"]; 

    } 

    [ps showWindow:nil]; 
} 

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

2015-01-05 12:13:08.671 Stamp Collection[2527:442573] unlockFocus called too many times. Called on <NSButton: 0x608000140420>. 

Как удалить это сообщение?

+0

Какая версия OS X? Используете ли вы слои с поддержкой слоев? Я видел это много, и некоторые причудливые сбои под 10.10 (тот же код работал нормально на 10.9). –

+0

Интересно - я пошел к 10.10.1 и заметил тогда. Я не помню, чтобы этот вопрос был ниже 10.9. – TLL

ответ

2

Это сообщение сообщает вам, что -lockFocus небаланс с его -unlockFocus. Это может быть как часть NSView или NSImage. Это может быть много причин. Вы могли бы позвонить lockFocus где-то прямо и не смогли разблокировать. Возможно, вы рисуете NSGraphicsContext или изображение без первого звонка lockFocus. Возможно, вы рисуете фоновый поток.

Если вы можете воспроизвести его достаточно надежно, вы можете поставить символическую точку останова на -[UIView unlockFocus] и -[NSImage unlockFocus] и посмотреть, по крайней мере, какой вид может быть задействован. Вероятно, это не имеет никакого отношения к вашему методу btnShowPriceSource.

0

У меня было то же сообщение при попытке отображения модального окна при нажатии кнопки.

Проблема решена кодом, показывающим модальный «внешний» код, вызываемый кнопкой.

В вашем случае это будет:

- (IBAction)btnShowPriceSource:(id)sender { 
    if (ps == nil){ 

     ps = [[PriceSource alloc] initWithWindowNibName:@"PriceSource"]; 

    } 
    dispatch_async(dispatch_get_main_queue(), ^(void) { 
     [ps showWindow:nil]; 
    } 
} 

код внутри блока должен выполняться сразу после того, как бы ни зафиксировать фокус на отпускании кнопки его.

Смежные вопросы