Реализация меню для маркеров
Если Вы хотите, чтобы маркеры в маркерном поле имели меню, необходимо реализовать tokenField:hasMenuForRepresentedObject: и tokenField:menuForRepresentedObject: методы делегации. Маркерное поле вызывает прежний метод непосредственно перед тем, как это выводит на экран маркер, чтобы узнать, должно ли это нарисовать треугольник открытия. Когда пользователь щелкает по треугольнику, это вызывает последний метод.
Перечисление 1 дает демонстрационную реализацию этих методов. Обратите внимание на то, что это устанавливает представленный объект маркера как представленный объект пункта меню, вызывающего метод действия. Цель метода действия выбирает представленный объект от пункта меню для реакции на него.
Перечисление 1 Реализовывая методы делегации меню
- (BOOL)tokenField:(NSTokenField *)tokenField hasMenuForRepresentedObject:(id)representedObject { |
return YES; |
} |
- (NSMenu *)tokenField:(NSTokenField *)tokenField menuForRepresentedObject:(id)representedObject { |
NSMenu *tokenMenu = [[[NSMenu alloc] init] autorelease]; |
if (![representedObject exists]) |
return nil; |
NSMenuItem *artistItem = [[[NSMenuItem alloc] init] autorelease]; |
[artistItem setTitle:[representedObject artist]]; |
[tokenMenu addItem:artistItem]; |
NSMenuItem *albumItem = [[[NSMenuItem alloc] init] autorelease]; |
[albumItem setTitle:[NSString stringWithFormat:@"Album: %@", [representedObject album]]]; |
[tokenMenu addItem:albumItem]; |
NSMenuItem *durationItem = [[[NSMenuItem alloc] init] autorelease]; |
[durationItem setTitle:[NSString stringWithFormat:@"Time: %@", [representedObject time]]]; |
[tokenMenu addItem:durationItem]; |
NSMenuItem *mItem = [[[NSMenuItem alloc] initWithTitle:@"Show Album Art" action:@selector(showAlbumArt:) keyEquivalent:@""] autorelease]; |
[mItem setTarget:self]; |
[mItem setRepresentedObject:representedObject]; |
[tokenMenu addItem:mItem]; |
return tokenMenu; |
} |