簡體   English   中英

如何處理多行的NSTableView拖放

[英]How to handle NSTableView Drag and Drop for multiple rows

我對Cocoa開發人員還很陌生,但是在NSTableView中實現單行拖放非常簡單。 但是,當選擇多行時,我現在很難使它正常工作。

當所有選定的行都是連續的時,這似乎沒有問題,但是例如,當您選擇行0和4(其中4是最后一行)並將它們拖動到中間的某個位置(例如第1或2行)時,它似乎失敗了)-失敗是指刪除了錯誤的行,因此我得到了重復項。

到目前為止,這是我的acceptDrop代碼:

- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id <NSDraggingInfo>)info
        row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation
{
    NSPasteboard* pboard = [info draggingPasteboard];
    NSData* rowData = [pboard dataForType:BasicTableViewDragAndDropDataType];
    NSIndexSet* rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:rowData];
    NSInteger dragRow = [rowIndexes firstIndex];
    NSArray *tempArray = [[NSArray alloc] initWithArray:_filePaths copyItems:YES];

    int i = 0;

  if (dragRow < row) 
    {
        while (dragRow != NSNotFound) 
        {
            int putRow = row + i;
            int deleteRow = dragRow;

            if (putRow > [_filePaths count]) { putRow = [_filePaths count]; }
            if (i >= 1)
            {
                // offset fix for already deleted rows
                deleteRow = deleteRow - i;
            }

            [_filePaths insertObject:[tempArray objectAtIndex:dragRow] atIndex:putRow];
            [_filePaths removeObjectAtIndex:deleteRow];

            dragRow = [rowIndexes indexGreaterThanIndex:dragRow];

            i++;
        }

        [_imagesTableView noteNumberOfRowsChanged];
        [_imagesTableView reloadData];

    return YES;

  }

    NSLog(@"dragging up");

    while (dragRow != NSNotFound) 
    {
        int putRow = row + i;
        if (putRow > [_filePaths count]) { putRow = [_filePaths count]; }

        [_filePaths removeObjectAtIndex:dragRow];
        [_filePaths insertObject:[tempArray objectAtIndex:dragRow] atIndex:putRow];

        dragRow = [rowIndexes indexGreaterThanIndex:dragRow];

        i++;
    } 

    [_imagesTableView noteNumberOfRowsChanged];
    [_imagesTableView reloadData];

  return YES;
}    

因此,在進行了大量的拖放操作(其中混入了一些應用程序崩潰)之后,我再次開始了網絡搜索,並在GitHub上找到了該類

我在那兒模仿了代碼,現在它像一種魅力一樣工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM