Alguien me puede ayudar a implementar la función de arrastrar y soltar en un NSTableView? He utilizado este código de abajo, pero estos métodos no están recibiendo llamadas durante la ejecución.

- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard
{
    //Copy the row numbers to the pasteboard.
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
    [pboard declareTypes:[NSArray arrayWithObject:@".gif"] owner:self];
    [pboard setData:data forType:@".gif"];
    return YES;
}

- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)op
{
    //Add code here to validate the drop

    if (row > [ m_imageArray count])
        return NSDragOperationNone;

    if (nil == [info draggingSource]) //From other application
    {
        return NSDragOperationNone;
    }
    else if (self == [info draggingSource]) //From self
    {
        return NSDragOperationNone;
    }
    else //From other documents 
    {
        [tv setDropRow: row dropOperation: NSTableViewDropAbove];
        return NSDragOperationCopy;
    }

    NSLog(@"validate Drop");
    return NSDragOperationCopy;
}


- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id <NSDraggingInfo>)info
              row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation
{
    NSPasteboard* pboard = [info draggingPasteboard];
    NSData* rowData = [pboard dataForType:@".gif"];
    NSIndexSet* rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:rowData];
    NSInteger dragRow = [rowIndexes firstIndex];

    //Move the specified row to its new location...
}
InformationsquelleAutor akhil gupta | 2011-05-10

7 Comentarios

  1. 9

    Es necesario declarar una costumbre de arrastre de tipo para su vista de tabla y, a continuación, llamar a registerForDraggedTypes: con el tipo personalizado. De lo contrario, como usted ha notado, ninguno de estos métodos es el llamado.

    • hola, gracias por tu sugerencia. pero no sé cómo declarar una costumbre dragtype
  2. 9

    Aquí es un ejemplo

    #import "TableViewController.h"
    #import "Person.h"
    #define MyDataType @"MyDataType"
    @implementation TableViewController {
    NSMutableArray *list;
    NSInteger sourceIndex;
    }
    @synthesize tableView;
    -(void)awakeFromNib {
    [tableView registerForDraggedTypes:[NSArray arrayWithObjects:MyDataType, nil]];
    list = [[NSMutableArray alloc] init];
    Person *person = [[Person alloc] initWithName:@"Newton" age:64];
    [list addObject:person];
    person = [[Person alloc] initWithName:@"Archimedes" age:74];
    [list addObject:person];
    person = [[Person alloc] initWithName:@"Euler" age:44];
    [list addObject:person];
    person = [[Person alloc] initWithName:@"Poincare" age:24];
    [list addObject:person];
    person = [[Person alloc] initWithName:@"Gauss" age:34];
    [list addObject:person];
    }
    -(void)reArrange:(NSMutableArray *)array sourceNum:(NSInteger)sourceNum destNum:(NSInteger)destNum {
    Person *person = list[sourceNum];
    [list insertObject:person atIndex:destNum];
    if (sourceNum < destNum) {
    [list removeObjectAtIndex:sourceNum];
    } else {
    [list removeObjectAtIndex:sourceNum+1];
    }
    [tableView reloadData];
    }
    #pragma mark - Table
    //how many rows are there in the table?
    -(NSInteger)numberOfRowsInTableView:(NSTableView *)tv {
    return list.count;
    }
    //What object should I show in a particular cell?
    -(id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    Person *person = list[row];
    NSString *identifier = [tableColumn identifier];
    return [person valueForKey:identifier];
    }
    //Should I accept the drag with the rows specified by rowIndexes? If YES then place the data on the provided paste board.
    - (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard {
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
    [pboard declareTypes:[NSArray arrayWithObject:MyDataType] owner:self];
    [pboard setData:data forType:MyDataType];
    sourceIndex = [rowIndexes firstIndex];
    return YES;
    }
    //What kind of drag operation should I perform?
    - (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)op {
    return op == NSTableViewDropAbove; //Specifies that the drop should occur above the specified row.
    }
    //The mouse button was released over a row in the table view, should I accept the drop?
    - (BOOL)tableView:(NSTableView*)tv acceptDrop:(id )info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)op {
    [self reArrange:list sourceNum:sourceIndex destNum:row]; //let the source array reflect the change
    return YES;
    }
    @end
    • Esta solución funciona muy bien, gracias!
    • Esta es una respuesta comprensiva, gracias por su tiempo.
  3. 1

    Me suele observar este tipo de error cuando se me olvidó conectar el dataSource a la NSTabeView en IB, es decir, la clase que implementa la tableView:writeRowsWithIndexes:toPasteboard: método de la NSTableViewDataSource.

  4. 1

    Arrastrar y Soltar NSTableview el uso de los datos de los núcleos

    1. Registro de tabla de la vista de objeto para arrastrar y soltar:-

      [tblCategory registerForDraggedTypes:[NSArray arrayWithObject:@"public.text"]];

    Arrastrar y soltar los métodos de Delegado:-

     - (id <NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row
    {
    Category *category = (Category *)[self.arrCategoryList objectAtIndex:row];
    NSString *identifier = category.categoryname;
    NSPasteboardItem *pboardItem = [[NSPasteboardItem alloc] init];
    [pboardItem setString:identifier forType: @"public.text"];
    return pboardItem;
    }
    - (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation
    {
    if(dropOperation == NSTableViewDropOn)
    {
    NSPasteboard *p = [info draggingPasteboard];
    NSString *title = [p stringForType:@"public.text"];
    Category* category ;
    NSInteger srcIndex;
    for (srcIndex = 0; srcIndex < [_arrCategoryList count]; srcIndex++)
    {
    category = [_arrCategoryList objectAtIndex:srcIndex];
    if ([category.categoryname isEqualToString:title])
    {
    break;
    }
    category = nil;
    }
    if(!category)
    {
    //Not found
    return NO;
    }
    [_arrCategoryList removeObjectAtIndex:srcIndex];
    [_arrCategoryList insertObject:category atIndex:row];
    [tblCategory reloadData];
    return NSDragOperationMove;
    }
    return NSDragOperationNone;
    }
    - (BOOL)tableView:(NSTableView *)tableView acceptDrop:(id <NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation
    {
    return YES;
    }
  5. 0

    Usted puede registrarse para draggedTypes para un NSMutableArray o NSMutableDictionary o cualquier otro objeto.Siguiente fragmento de Código es para un NSMutableArray.

    [tableView registerForDraggedTypes:[NSArray arrayWithObject:@"NSMutableArray"] ];

  6. 0

    Deberá declarar un registerForDraggedTypes método en awakFromnib

    como este.

    [table_view registerForDraggedTypes:[NSArray arrayWithObjects:BasicTableViewDragAndDropDataType, nil]];
  7. 0

    Tengo que recomendar tanto este excelente Suéter Rojo blog

    http://www.red-sweater.com/blog/274/a-moveable-beast

    Proporciona una NSArrayController sub-clase, lo que permitirá arrastrar y soltar re-ordenamiento de los ítems de la tabla, y si usted desea apoyar a arrastrar fuera del formato tableview con sus objetos, que hemos escrito una limpia y sencilla, además de que la clase:

    http://www.rwe-uk.com/blog/comments/nstableview_drag_and_drop_with_bindings_and_nsarraycontroller

    Se basa en el post original

    • Enlace roto «Sitio de Error: no se puede Cargar el Sitio de las Preferencias; Sin Preferencias Encontrado»

Dejar respuesta

Please enter your comment!
Please enter your name here