TextField по умолчанию в элементе статуса

У меня есть текстовое поле внутри элемента состояния, и я хотел бы, чтобы оно сразу же активировалось при нажатии элемента состояния. Я попробовал обычный becomeFirstResponder в applicationDidFinishLaunching, а затем в awakeFromNib, но это не сработало. Я предполагаю, что это потому, что меню элемента состояния не открыто, когда эти методы вызываются при запуске, возможно, игнорируя его. Затем я попытался установить действие при нажатии элемента состояния, но кто-то здесь сказал мне, что эти действия могут быть выполнены только в том случае, если элемент состояния не имеет раскрывающегося меню, как у меня. Я хочу, чтобы элемент состояния был нажат, а раскрывающееся меню появилось с активированным текстовым полем, чтобы можно было немедленно начать печатать. Я использую настраиваемое представление для отображения текстового поля в меню, не уверен, что это актуально, но, может быть, в этой ситуации предполагается использовать что-то еще?

Спасибо.


person Elbimio    schedule 11.07.2011    source источник


Ответы (1)


Вы можете установить объект как delegate в меню пункта статуса, реализовать метод делегата ‑menuWillOpen:, а затем использовать ‑performSelector:withObject:afterDelay:modes: для установки первого ответчика.

Это гарантирует, что вызов сделать текстовое поле первым ответчиком произойдет при следующем прогоне цикла событий после открытия меню. Вам нужно передать NSRunLoopCommonModes или NSEventTrackingRunLoopMode в массиве режимов цикла выполнения, переданном параметру modes:, потому что обычный метод performSelector:withObject:afterDelay: не будет вызывать селектор, пока меню не будет закрыто.

- (void)menuWillOpen:(NSMenu *)menu
{
    [self performSelector:@selector(highlightField) withObject:nil afterDelay:0.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
}

- (void)highlightField
{
    [[yourTextField window] makeFirstResponder:yourTextField];
}
person Rob Keniger    schedule 11.07.2011
comment
По крайней мере, у меня есть действие, которое нужно выполнить, когда я щелкнул элемент состояния, но [[ваше окно TextField] makeFirstResponder:yourTextField]; не работал. Я заставил метод поместить 5 в текстовое поле, чтобы увидеть, работает ли он, когда он открылся, ничего не произошло, но когда я закрыл его и снова открыл, 5 был там. Кажется, он работает почти как menuDidClose. Не уверен, что происходит... - person Elbimio; 11.07.2011
comment
Извините, вместо этого я должен был использовать метод ‑performSelector:withObject:delay:modes. Вам необходимо запланировать вызов метода в режиме цикла выполнения NSRunLoopCommonModes, если вы хотите, чтобы он происходил во время отслеживания меню. Я обновил ответ. - person Rob Keniger; 11.07.2011