Hi Jens, Thanks for your help. I've been trying to get the option 1 approach to work, but I don't know what I'm meant to do with my NSValue. I can't find how to convert it to an NSData type.
Thanks again, Billy. On 26 Apr 2010, at 15:46, Jens Alfke wrote: > > On Apr 26, 2010, at 5:58 AM, Billy Flatman wrote: > >> I'm trying to put a custom object into past board in order to perform a drag >> operation. > > You can’t do that, for the same reason you can’t directly write a custom > object to a file. The pasteboard basically stores bytes, so it has to be able > to convert what you store in it to and from a stream of bytes. There are a > limited number of data types it understands — strings, numbers, arrays, > dictionaries and of course raw data. > >> ** This doesn't (actually stops drag and drop working for my >> application until I logout). >> [pboard setData:[items objectAtIndex:0] forType:kOutlineViewGroupType]; > > You’re passing the wrong type of object to the setData: parameter. Look at > the header or the docs — it takes an NSData. You’re passing it some other > custom object. The result is going to be an exception or a crash. (The reason > this doesn’t produce a warning at compile time is because -objectAtIndex: > just returns type id, which is compatible with anything (it’s like void* for > objects.) You have to pay attention to what type of object you know is in the > array. > > If you want to put a custom object in the pasteboard, there are several ways: > > (1) Wrap it in an NSValue via [NSValue valueWithPointer:]. This is kind of > dangerous because you have to make sure the object won’t get dealloced before > the pointer is eventually used, since -valueWithPointer: doesn’t retain the > object. > (2) Store some value that refers to the object, like a row number or an > access key. You have to make sure that value will continue to work, i.e. the > row number remains correct. > (3) Implement a way to serialize the object into data or a dictionary/array. > Implementing the NSCopying protocol is a standard way to do that. > > The first two techniques are OK for drag-n-drop because the lifetime of the > pasteboard is limited. If you want to implement copy and paste you probably > need to go with #3 because the pasteboard could stay around for an arbitrary > amount of time. > > —Jens Billy Flatman [email protected] _______________________________________________ Cocoa-dev mailing list ([email protected]) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to [email protected]
