2010-01-31 3 views
1

Мое приложение использует метод -validateMenuItem: для проверки элементов меню. Но мне нужно проверить различные пункты меню в зависимости от того, что там находится.Получение NSPopUpButton из NSMenuItem

Я надеялся на способ получить тег всплывающего окна, но, просмотрев документы, я не могу найти способ. .. есть идеи?

Edit: Я думал, что это нужно еще некоторый контекст ... моя модель объекта является JDBCSyncer (синхронизируется одна база данных с другим), мое окно настроек один, и мне нужно, чтобы проверить свои пункты меню, основанные на их заголовок находится в массиве строк, который представляет различные поля внутри таблицы. Идея состоит в том, что вы выбираете поле из всплывающего окна.

ответ

3

У меня нет большой ответ с верхней части моей головы, но как о чем-то вдоль этих линий:

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem 
{ 
    NSMenu *menu = [menuItem menu]; 
    if (menu == [popUpButton1 menu]) { 
     return YES; 
    } 
    else if (menu == [popUpButton2 menu]) { 
     return NO; 
    } 
    else (menu == [popUpButton3 menu]) { 
     return YES; 
    } 
    else { 
     return NO; 
    } 
} 
+0

Это не будет работать с подменю. –

0

Если пункты меню в этих всплывающих кнопок настолько связаны, что вам нужно чтобы отличить одну всплывающую кнопку от другой, возможно, вам следует создать для нее отдельные объекты контроллера. Каждый контроллер будет целевым (и, таким образом, валидатором) его пунктов меню «всплывающие кнопки» и только, что/эти всплывающие кнопки.

Некоторые или все эти контроллеры также могут подавать представления таблиц или виды коллекций, если это имеет смысл для рассматриваемых предметов.

Это также позволяет пометить элементы меню для упрощения идентификации, не беспокоясь о столкновениях с тегами (тот же тег, используемый в двух или более несвязанных элементах пользовательского интерфейса), поскольку каждый контроллер будет видеть только те метки, о которых он знает. Аналогично, если контроллер использует представленные объекты (наиболее вероятно, если он динамически заполняет свои всплывающие кнопки), ему не нужно беспокоиться о том, чтобы увидеть представленные объекты, которые он не распознает.

+0

Кажется, это хорошая идея. Я создал новый набор контроллеров, и они получают validateMenuItem: как и планировалось. Но теперь у меня другая проблема, я проверял NSMenuItem, проверяя его название в NSArray. Этот массив был возвращен из моего объекта модели, который принадлежит моему «основному» контроллеру. Итак, теперь у моих новых контроллеров нет доступа к этому массиву. Я уверен, что это что-то очень простое, но я довольно новый для какао и до сих пор пытаюсь понять, шаблон проектирования, Приветствия, Маркус –

+0

А также, мое всплывающие окна содержимого было привязки к этому NSArray –

+0

Так ваша модель объект владеет массивом названий? Это похоже на часть параллельного массива, что неверно. У вас должен быть массив объектов модели, каждый из которых имеет один заголовок. Помните, модель объекта моделирует * что-то *; в этом случае это то, что имеет название. –