2

私は 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;
}    
4

1 に答える 1

4

そのため、ドラッグアンドドロップを何度も行った後(そしてそこにいくつかのアプリケーションクラッシュが混在した後)、Web検索を再開し、GitHubでこのクラスを見つけました。

そこでコードを模倣しましたが、今では魅力のように機能しています。

于 2012-05-03T17:59:00.877 に答える