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]

Reply via email to