2010-12-22 16 views
2

Ich möchte eine Zeile aus meiner Tabellenansicht ziehen und sie in ein beliebiges anderes NSTextField in Mac OS X 10.6 einfügen und eine Textzeile löschen lassen.String-Daten von My Cocoa App in die Cocoa-App von Drittanbietern ziehen

Drag & Drop funktioniert bereits innerhalb meiner App (zwischen einem NSTableView und einem NSBrowser), aber ich habe keinen Erfolg beim Einfügen von Daten auf der Pappe, die von anderen Apps als der Quellanwendung akzeptiert werden.

Hier ist der Code, den ich versuchte, die ich dachte, würde ausreichen, um hte Wort „Hallo“ zu ‚geklebt‘, wenn ich fallen in eine andere NSTextField zu bekommen:

-(BOOL) tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes  toPasteboard:(NSPasteboard *)pboard { 

    [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; 
    [pboard setString:@"hello" forType:NSStringPboardType]; 

return YES; 

}

// -

Ich bekomme nie den Cursor, der mir zeigt, dass der Tropfen akzeptiert wird, und es funktioniert einfach nicht.

  • Dinge, die ich habe versucht:
    • die Version 10.5 des Pappen Kennung verwenden, NSStringPBoardType
    • die 10.6-Version verwenden, NSPasteboardTypeString.
    • Einstellung der Besitzer = Nil, da ich die Daten nicht träge bereitstellen.
    • die Schlüsselarchivierungs Verwendung: [pboard setData: [NSKeyedArchiver archivedRootObject: @ "Hallo !!"]]

Keines der oben genannten gearbeitet haben. Ich denke, ich habe die richtigen Konzepte: "Daten kodieren, der Pappe mitteilen, was du hast, und dann die Daten angeben", aber da andere Apps es nicht erkennen, vermute ich, dass ich der Pappe nicht den richtigen Datentyp erzähle .

Wohin gehe ich falsch?

Danke, Woody

Antwort

6

Fügen Sie diese in Ihrer der Controller-Klasse awakeFromNib:

- (void)awakeFromNib { 
    [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO]; 
    // [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES]; 

} 

(Dies wird vorausgesetzt, Sie haben eine IBOutlet zu Ihrem Tableview tableView genannt angeschlossen). Achten Sie darauf, dies in awakeFromNib oder später zu tun. (Wenn Sie beispielsweise versuchen würden, dies in der Methode Ihrer Controller-Klasse zu tun, wären Ihre Nib-Dateien noch nicht vollständig geladen, und Ihre IBOutlet wäre nil und die Nachricht hätte keinen Effekt).

Standardmäßig sind die meisten Ziehvorgänge auf die lokale Anwendung und nicht auf alle Anwendungen beschränkt. Der Parameter gibt an, ob Sie auf Ziehvorgänge verweisen, die lokal für die Anwendung (innerhalb derselben Anwendung) oder nicht lokal sind, also für alle Anwendungen. Die Zeile, die auskommentiert ist, ist im Grunde das, was Sie bereits tun.

+0

Das ist es total. Sie haben diese Linie fallen gelassen, wie Sie gesagt haben, und jetzt sind alle Motoren weg. Vielen Dank. – Woodster

Verwandte Themen