Pregunta

tengo que arrastrar una referencia a un NSManagedObject entre dos vistas de tabla de mi solicitud. ¿Cuál es el tipo NSPasteboard preferido para almacenar una referencia a un NSManagedObject?

Mi solución actual es almacenar el URIRepresentation de NSManagedObjectID del objeto en un NSPasteboardTypeString. Sospecho que hay una solución más elegante que hay.

¿Fue útil?

Solución

No hay ningún tipo estándar para todos los objetos del modelo, ya que sus objetos de modelo y cómo se manejan son exclusivos de la aplicación. Si había un tipo de cartón para todo, entonces no habría distinguirlos. Su propio objeto personalizado debe tener su propio tipo de arrastre.

Sólo tiene que utilizar una cadena que tenga sentido (tal vez un #define para que pueda encontrar con la función de autocompletar en Xcode) como "MyObjectPboardType" que se resuelve en "com.yourcompany.yourapp.yourobjecttype".

-declareTypes de Uso NSPasteboard: Propietario: Declarar el nuevo tipo, a continuación, utilizar -setString: paratipo: o uno de los otros -set:? Paratipo: métodos para establecer la información para el tipo de su objeto. En su caso, el uso de la ID de objeto es un identificador perfectamente aceptable. Sólo recuerde cambio de ID de objetos objetos administrados cuando son nuevos en comparación con persistido.

Otros consejos

Si arrastra dentro de las tablas en la misma aplicación que también podría poner en la mesa de trabajo los rowIndexes (indexPaths en caso de que se arrastraban desde una outlineView) de los objetos en el tableView (outlineView). Esta fuerza también te ahorrará tiempo de algún acceso CoreData que no sean necesarios si la fuente de datos de los tableViews son NSArrayController (NSTreeController para outlineView). A continuación, puede recuperar fácilmente los objetos arrastrados al aceptar la caída desde la 'info' objeto pasado a ambos métodos 'tableView: validateDrop: proposedRow: proposedDropOperation:' y 'tableView: acceptDrop: Fila: dropOperation:' tendrá una referencia a la tableView origina el arrastre bajo ruta de clave 'draggingSource'.

Esta es una aplicación sencilla:

extern NSString *const kMyLocalDragType = @"com.whatever.localDragType";
@implementation MyArrayControllerDataSource
    .
    .
    .
#pragma mark - NSTableViewDataSource (Drag & Drop)
+ (NSArray *)dragTypes {
    // convenience method returning all class's supported dragTypes
    return @[kMyLocalDragType];
 }
- (BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard {
    [pboard declareTypes:[[self class] dragTypes] owner:self];
    for (NSString *aDragType in [[self class] dragTypes]) {
        if (aDragType == kMyLocalDragType) {
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes]; // we are supporting drag&drop of multiple items selected    
        [pboard setData:data forType:aDragType];
        }
        .
        . // logic for other dragTypes 
        .
    }
    return YES;
} 
- (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id<NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation {
    NSArray *dragTypes = [info draggingPasteboard] types];
    for (id aDragType in dragTypes) {
        if (aDragType == kMyLocalDragType) {
         return NSDragOperationCopy;
        }
    }
    .
    .// Other logic for accepting drops/affect drop operation
    .
}

- (BOOL)tableView:(NSTableView *)tableView acceptDrop:(id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation {
    if ([info draggingPasteboard] types] containsObject:kMyLocalDragType]) {
        // Retrieve the index set from the pasteboard:
        NSData *data = [[info draggingPasteboard] dataForType:kMyLocalDragType];
        NSIndexSet *rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        NSArray *droppedObjects = [self retrieveFromTableView:tableView objectsAtRows:rowIndexes];
        // droppedObjects contains dragged and dropped objects, do what you
        // need to do with them, then add them to this dataSource:
        [self.content insertObjects:droppedObjects];
        [tableView reloadData];
        [tableView deselectAll:nil];
        return YES;
    }
        .
        . // other logic for accepting drops of other dragTypes supported. 
        .
}

#pragma mark - Helpers
- (NSArray <NSManagedObject *> *)retrieveFromTableView:(NSTableView *)tableView objectsAtRowIndexes:(NSIndexSet *)rowIndexes {
    id dataSource = [tableView dataSource];
    if ([dataSource respondsToSelector:@selector(content)]) {
        if ([dataSource.content respondsToSelector:@selector(objectsAtIndexes:)]) {
            return [datasource content] objectsAtIndexes:rowIndexes];
        }
    }
    return @[]; //We return an empty array in case introspection check failed
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top