ลากและวางแอนิเมชั่นจะถอยกลับไปยังแหล่งที่มา

ลากและวางแอนิเมชั่นจาก 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