Animasi seret dan lepas mundur kembali ke sumbernya

Seret dan lepas animasi dari NSTableView ke NSTextView jendela lain akan kembali ke tampilan sumber, bukan ke tampilan teks. Jika tidak, tindakan seret dan lepas berfungsi dengan baikā€”data saya akan ditempel. Subkelas NSTextView saya memiliki semua metode protokol drag-and-drop (lihat kode di bawah). Apa yang salah?

- (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 sumber


Jawaban (1)


Di -prepareForDragOperation: Anda ingin menyetel sender.animatesToDestination = NO, dalam hal ini, hal-hal yang diseret akan hilang begitu saja saat Anda menjatuhkannya, alih-alih mundur kembali.

Atau, jika Anda menginginkan sesuatu yang lebih bagus namun lebih rumit, Anda dapat menggunakan -enumerateDraggingItemsWithOptions:etc:etc: untuk menelusuri setiap item yang dimasukkan ke tampilan teks Anda dan mengatur dragFrame-nya dengan tepat, dalam hal ini hal-hal yang menjadi diseret akan bernyawa ke tujuan akhir pilihan Anda.

person gregomni    schedule 01.03.2014
comment
Terima kasih atas sarannya, namun animasinya masih mundur. Firasat saya adalah dengan menggunakan subkelas NSTextView, jendela First Responder-nya tidak bereaksi terhadap peristiwa penyeretan. Saya tidak yakin apa yang harus saya lakukan terhadap kemungkinan ini. - person Antony; 03.03.2014
comment
Saya mempunyai masalah yang sama. Apakah Anda menemukan solusinya? - person Teo Sartori; 04.09.2014