Как вызвать registerForDraggedTypes в NSViewController? - PullRequest
4 голосов
/ 16 ноября 2011

У меня есть MainViewController с разделенным видом. Далее у меня есть два viewcontroller для управления каждым из представлений в splitview. Я хочу иметь возможность перетаскивать файл в одном из этих представлений.

Но я не могу заставить перетаскивание работать? При перетаскивании на представление в файле нет знака «плюс», и удаление его также ничего не делает.

Что я делаю не так?

Сначала вот MainViewController.m

fileViewController = [[FileViewController alloc] initWithNibName:@"FileViewController" bundle:nil];
terminalViewController = [[TerminalViewController alloc] initWithNibName:@"TerminalViewController" bundle:nil];

[splitView replaceSubview:[[splitView subviews] objectAtIndex:0] with:[fileViewController view]];
[splitView replaceSubview:[[splitView subviews] objectAtIndex:1] with:[terminalViewController view]];

Далее мой код для обработки перетаскивания в FileViewController

@dynamic isHighlighted;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        NSLog(@"registering");
        [self.view registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
    }



    return self;
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));

    NSPasteboard *pboard = [sender draggingPasteboard];

    if ([[pboard types] containsObject:NSFilenamesPboardType]) {

        NSArray *paths = [pboard propertyListForType:NSFilenamesPboardType];
        for (NSString *path in paths) {
            NSError *error = nil;
            NSString *utiType = [[NSWorkspace sharedWorkspace]
                                 typeOfFile:path error:&error];
            if (![[NSWorkspace sharedWorkspace] 
                  type:utiType conformsToType:(id)kUTTypeFolder]) {

                [self setHighlighted:NO];
                return NSDragOperationNone;
            }
        }
    }
    [self setHighlighted:YES];
    return NSDragOperationEvery;
}

- (void)draggingExited:(id <NSDraggingInfo>)sender {
    [self setHighlighted:NO];
}


- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender  {
    return YES;
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    [self setHighlighted:NO];
    return YES;
}

- (void)concludeDragOperation:(id )sender {
    [self.view setNeedsDisplay:YES];
} // end concludeDragOperation

- (BOOL)isHighlighted {
    return isHighlighted;
}

- (void)setHighlighted:(BOOL)value {
    isHighlighted = value;
    [self.view setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)frame {
    [self.view drawRect:frame];
    if (isHighlighted) {
        [NSBezierPath setDefaultLineWidth:6.0];
        [[NSColor keyboardFocusIndicatorColor] set];
        [NSBezierPath strokeRect:frame];
    }
}

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Я, похоже, не исправил это, и поскольку никто не дал мне никаких ответов, я исправил это, создав подкласс NSView и добавив его в свой viewcontroller, как это.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        draggable = [[DragView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
        [[self view] addSubview:draggable];
    }

    return self;
}
0 голосов
/ 11 декабря 2013

Я никогда не занимался программированием на OS X, но проблема в том, что, поскольку вы регистрируете self.view для получения перетаскивания, ваш self.view должен обрабатывать операции перетаскивания, а не контроллер представления. Итак, вы правы в подклассах от NSView до DragView, и вы должны передать операции перетаскивания обратно в контроллер представления.

Кроме того, я считаю, - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender должно быть реализовано.

...