Анимация перетаскивания возвращается к источнику

Анимация перетаскивания из NSTableView в NSTextView другого окна возвращается к исходному представлению, а не к текстовому представлению. В противном случае действие перетаскивания работает нормально — мои данные вставляются. Мой подкласс NSTextView имеет все известные методы протокола перетаскивания (см. код ниже). Что может пойти не так?

- (void)awakeFromNib { // Adjust default insets
[self setTextViewInset];
[self registerForDraggedTypes:[NSArray arrayWithObjects:AWNDragNDropGeneralRuleRecordType, nil]]; 
[self registerAsObserver];
}

- (void)registerAsObserver
{
    [self addObserver:scrollerSubclass
           forKeyPath:@"focused"
              options:NSKeyValueObservingOptionNew
              context:NULL];
}

- (BOOL)acceptsFirstResponder
{
    NSLog(@"Accepting");
    [self setFocused:YES];
    return YES;
}

- (BOOL)resignFirstResponder
{
    NSLog(@"Resigning");
    [self setFocused:NO];
    [super resignFirstResponder]; // Otherwise cursor remains in textView
    return YES;
}

- (BOOL)becomeFirstResponder
{
    NSLog(@"Becoming");
    return YES;
}

- (void)setFocused:(BOOL)x
{
    NSLog(@"-setFocused: is called with %d",x);
    focused = x;
}


- (BOOL)focused
{
    NSLog(@"-focused: is returning %d",focused);
    return focused;
}


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


- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
    NSLog(@"draggingEntered:");
    if ([sender draggingSource] == self) {
        return NSDragOperationNone;
    }

    return NSDragOperationCopy;
}


- (void)draggingExited:(id <NSDraggingInfo>)sender
{
    NSLog(@"Draging Exited:");
    [self setNeedsDisplay:YES];
}


- (void)draggingEnded:(id < NSDraggingInfo >)sender
{
    [self performDragOperation:sender];     
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{ // Look for drag source in 'SpellRuleFiles.SpellRulesWindowDelegate tableView delegate method
    NSPasteboard *pb = [sender draggingPasteboard];

    if (![self readFromPasteboard:pb]) {
        NSLog(@"Error: Could not read from dragging pasteboard");
        NSLog(@"performDragOperation NO");
        return NO;
    }
    NSLog(@"performDragOperation YES");
    return YES;
}


- (BOOL)readFromPasteboard:(NSPasteboard *)pb 
{ // Source of paste data is 'SpellRuleFile's ' 

    // I'm not showing this code

    return YES;     
}

- (void)concludeDragOperation:(id <NSDraggingInfo>)sender
{
    NSLog(@"conclude drag operation:");
    [self setNeedsDisplay:YES];
}

person Antony    schedule 28.02.2014    source источник


Ответы (1)


В -prepareForDragOperation: вы хотите установить sender.animatesToDestination = NO, и в этом случае перетаскиваемые вещи просто исчезнут, когда вы их бросите, вместо того, чтобы отскакивать назад.

Или, если вы хотите что-то более красивое, но более сложное, вы можете использовать -enumerateDraggingItemsWithOptions:etc:etc: для просмотра каждого из элементов, которые перетаскиваются в ваше текстовое представление, и соответствующим образом устанавливать их draggingFrame, и в этом случае вещи, которые получают перетащите анимацию в конечный пункт назначения по вашему выбору.

person gregomni    schedule 01.03.2014
comment
Спасибо за предложение, однако анимация все еще отскакивает. Я предполагаю, что при использовании подкласса NSTextView каким-то образом его окно First Responder не реагирует на событие перетаскивания. Я не уверен, что делать с этой возможностью. - person Antony; 03.03.2014
comment
У меня такая же проблема. Вы нашли решение? - person Teo Sartori; 04.09.2014