Опитвам се да активирам Услуги, които работят на избрани Files and Folders
подобни на тези, които могат да бъдат извикани в Finder.
Имам следното въз основа на Services Implementation Guide
който работи, но само за текста и т.н.
+ (void)initialize {
static BOOL initialized = NO;
/* Make sure code only gets executed once. */
if (initialized == YES) return;
initialized = YES;
NSArray *sendTypes = [NSArray arrayWithObject:NSStringPboardType];
[NSApp registerServicesMenuSendTypes:sendTypes returnTypes:nil];
NSLog(@"initialize MyTableView");
}
- (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType {
NSLog(@"validRequestorForSendType %@%@", sendType, returnType);
if ([sendType isEqual:NSStringPboardType]) {
return self;
}
return [super validRequestorForSendType:sendType returnType:returnType];
}
Как да внедря URL адрес?
В документацията се посочва
Вашият обект NSResponder може да регистрира всекитип данни от пастел, обществено или патентовано, често или рядко. Ако тя се занимава с обществеността и е обща видове, разбира се, има достъп до повече услуги. За списък с стандартни типове данни за памет, вижте NSP Каталожна класификация на класа.
Изглежда, че няма съответстващ тип данни на пастов картон. опитах NSURL
, NSURL class
NSFilenamesPboardType
работи частично, но не показва всички услуги Finder, и изглежда, че принадлежи на (OS X v10.5 и по-рано)
Редактиране на изясняване
Следвах Services Implementation Guide
, която изглежда има 3 стъпки
1. Регистриране на обекти за услуги
NSApp registerServicesMenuSendTypes: returnTypes:
2.Извършване на менюто за услуги
validRequestorForSendType:returnType:
3. Изпращане на данни до службата
writeSelectionToPasteboard:types:
Имам първите 2 частично да работя (въпреки че не мога да получа същото меню, което виждам в Finder, когато е избран Файл, по-специално Files and Folders
)
Третият изглежда е залепващият момент Това изглежда е подкрепено NSTextView
, но отхвърлен за NSObject
Наистина търся някаква идея как да използвам Услугите Files and Folders
по същия начин, както много други приложения.
Отговори:
1 за отговор № 1Направих тази работа и публикувам резултата в полза на други, които биха искали да направят подобни.
Първите 3 метода са в моя клас, които подкласират Изглед
+ (void)initialize {
static BOOL initialized = NO;
/* Make sure code only gets executed once. */
if (initialized == YES) return;
initialized = YES;
[NSApp registerServicesMenuSendTypes:[NSArray arrayWithObject:(__bridge NSString *)kUTTypeFileURL] returnTypes:nil];
}
- (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType {
if ([sendType isEqual:(__bridge NSString *)kUTTypeFileURL]) {
return self;
}
return [super validRequestorForSendType:sendType returnType:returnType];
}
- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard types:(NSArray *)types {
if([self.keyDelegate respondsToSelector:@selector(writeSelectionToPasteboard:types:)])
return [self.keyDelegate writeSelectionToPasteboard:pboard types:types];
return FALSE;
}
Последният от делегатите действително пише на картонената кутия.
- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard types:(NSArray *)types {
return [pboard setString:[[[self selectedFile] url] absoluteString] forType:(__bridge NSString *)kUTTypeFileURL];
}
Имаше известно количество предположения / експерименти, защото изискванията изглежда не са ясно определени. Това е просто изпълнение, защото се интересувам само от един тип.