2010-07-21 3 views
1

Я реализую пользовательское меню состояния, которое имеет пользовательский вид с NSSearchField. Я обновляю количество пунктов меню в соответствии с результатами поиска. Количество элементов меню изменяется как пользовательские типы в NSSearchField. Я заметил, что если количество результатов остается неизменным, названия элементов не обновляются (перерисовываются). Как заставить их перерисовывать?Как заставить NSMenuItem перерисовать?

В функции, которая перестраивает меню, я удаляю сначала все элементы, а затем создаю новые элементы в соответствии с результатами поиска.

Спасибо,

Нава

ответ

2

Я мог бы достичь этого с помощью следующего подхода: когда количество результатов поиска одинаково, я их не воссоздаю, просто измените заголовок и вызывайте itemChanged :. Когда счетчик отличается, я воссоздаю пункты меню. Это все равно. Но в любом случае мне было рекомендовано вернуться из меню для этих целей.

1

на меню установите menuChangedMessagesEnabled в YES, когда вы хотите, чтобы обновить меню:

[menu setMenuChangedMessagesEnabled:NO]; 
// change the menu 
[menu setMenuChangedMessagesEnabled:YES]; 

Второй вызов вызывает меню, чтобы применить изменения. Первый из них состоит в том, что вы можете объединить группу изменений вместе.

Тем не менее, рекомендации Apple запрещают изменение меню, пока они открыты, поскольку пользователи не привыкли к этому и могут ввести в заблуждение. Если это возможно, попробуйте изменить свое приложение, чтобы вы могли использовать что-то еще, скажем, таблицу или матрицу, а не меню.

+0

Вот что говорит документация: /* В SnowLeopard следующие методы больше не приносят ничего полезного. */ - (void) setMenuChangedMessagesEnabled: (BOOL) флаг; ?. :( Есть другой способ сделать это –

+0

хмм, так что кажется, вы пробовали вызов 'itemChanged:' Я не уверен, если это назначение для него, но может работать – mohsenr

+0

?. да, я пробовал, не помогает –