Frage

Ich brauche einen Verweis auf ein NSManagedObject zwischen zwei Tabellenansichten meiner Anwendung zu ziehen. Was ist die bevorzugte NSPasteboard Art einen Verweis auf ein NSManagedObject zu speichern?

Meine aktuelle Lösung ist die URIRepresentation der NSManagedObjectID des Objekts zu speichern, in einer NSPasteboardTypeString. Ich vermute, es gibt eine elegantere Lösung gibt.

War es hilfreich?

Lösung

Es gibt keinen Standardtyp für alle Modellobjekte, da Ihre Modellobjekte und wie sie gehandhabt einzigartig für Ihre Anwendung. Wenn es für alle einen Karton Typ ist, dann würde es ihnen auseinander nicht sagen. Ihr eigenes benutzerdefiniertes Objekt sollte seine eigenen abgespitzte hat.

Nur eine Zeichenfolge verwenden, die Sinn macht, wie „MyObjectPboardType“ dass Entschlüsse zu „com.yourcompany.yourapp.yourobjecttype“ (vielleicht ein #define so können Sie es mit Auto-Vervollständigung in Xcode finden).

Mit NSPasteboard der -declareTypes: Besitzer: Ihre neue Art zu erklären, dann verwenden -setString: forType: oder eines des anderen -Set: forType: Methoden, um die Daten, um der für den Typen Ihres Objekts. In Ihrem Fall ist die Verwendung des Objekt-ID eine durchaus akzeptable Kennung. Denken Sie daran, verwaltete Objekte Objekt-IDs ändern, wenn sie neu im Vergleich zu bestehen bleibt.

Andere Tipps

Wenn Sie innerhalb von Tabellen in der gleichen Anwendung schleppen Sie auch in dem Einfügebereich rowIndexes aussetzen könnten (indexPaths, falls Sie von einem outlineView schleppen) der Objekte im Tableview (outlineView). Dies könnte auch Ersatz Sie einig nicht benötigten Coredata-Zugang, wenn die Datenquelle des Tableviews ist NSArrayController (NSTreeController für outlineView). Sie können dann problemlos abrufen können die Objekte gezogen, wenn die Tropfen, da die ‚Info‘ Objekt an beide Methoden übergeben zu akzeptieren ‚Tableview: validateDrop: proposedRow: proposedDropOperation:‘ und ‚Tableview: acceptDrop: Reihe: dropOperation:‘ einen Verweis auf die haben tableview Ursprung der Drag unter ‚draggingSource‘ Schlüsselpfad.

Hier ist eine einfache Implementierung:

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top