Перетаскивание с помощью NSStatusItem
Я пытаюсь написать приложение, которое позволяет пользователю перетаскивать файлы из Finder и отбрасывать их на NSStatusItem
. До сих пор я создал настраиваемое представление, которое реализует интерфейс перетаскивания. Когда я добавляю это представление в качестве подчиненного элемента NSWindow
, все работает корректно - курсор мыши дает соответствующую обратную связь, а при удалении мой код запускается.
Однако, когда я использую тот же вид, что и просмотр NSStatusItem's
, он не ведет себя корректно. Курсор мыши дает соответствующую обратную связь, указывающую на то, что файл можно удалить, но когда я удаляю файл, мой код возврата никогда не будет выполнен.
Есть ли что-то особенное, что мне нужно сделать, чтобы включить перетаскивание с помощью NSStatusItem
?
Ответы
Ответ 1
Я, наконец, добрался до тестирования этого, и он отлично работает, поэтому с вашим кодом определенно что-то не так.
Здесь пользовательский вид, который позволяет перетаскивать:
@implementation DragStatusView
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
//register for drags
[self registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
//the status item will just be a yellow rectangle
[[NSColor yellowColor] set];
NSRectFill([self bounds]);
}
//we want to copy the files
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
{
return NSDragOperationCopy;
}
//perform the drag and log the files that are dropped
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{
NSPasteboard *pboard;
NSDragOperation sourceDragMask;
sourceDragMask = [sender draggingSourceOperationMask];
pboard = [sender draggingPasteboard];
if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
NSLog(@"Files: %@",files);
}
return YES;
}
@end
Здесь вы можете создать элемент состояния:
NSStatusItem* item = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
DragStatusView* dragView = [[DragStatusView alloc] initWithFrame:NSMakeRect(0, 0, 24, 24)];
[item setView:dragView];
[dragView release];
Ответ 2
Поскольку Yosemite, метод установки представления на NSStatusItem
устарел, но, к счастью, гораздо лучше использовать новое свойство NSStatusItemButton
на NSStatusItem
:
- (void)applicationDidFinishLaunching: (NSNotification *)notification {
NSImage *icon = [NSImage imageNamed:@"iconName"];
//This is the only way to be compatible to all ~30 menu styles (e.g. dark mode) available in Yosemite
[normalImage setTemplate:YES];
statusItem.button.image = normalImage;
// register with an array of types you'd like to accept
[statusItem.button.window registerForDraggedTypes:@[NSFilenamesPboardType]];
statusItem.button.window.delegate = self;
}
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
return NSDragOperationCopy;
}
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
//drag handling logic
}
Имейте в виду, что свойство button
доступно только начиная с 10.10, и вам, возможно, придется оставить свое старое решение, если вы поддерживаете 10.9 Mavericks или ниже.