On May 20, 2008, at 6:17 AM, Liviu Andron wrote:
On Tue, May 20, 2008 at 10:57 AM, stephen joseph butler <
[EMAIL PROTECTED]> wrote:

On Tue, May 20, 2008 at 1:50 AM, Liviu Andron
<[EMAIL PROTECTED]> wrote:
setRepresentedObject: is a hint, thanks, but it doesn't resolve the
problem
either: he MUST copy every property from the original NSButtonCell (font,
attributedTitle, imageDimsWhenDisabled, etc).

This is how you will have to do it.


[buttonCellInstance setAlignment:[nsButtonCellInstance alignment]];

With some comments the code has 40 lines, and I copied only what I thought
it will be useful.
This is the solution for the moment. Solution A (see below).

Though tedious and vulnerable to future changes to NSButtonCell, this has the advantage that it is very straightforward. Unlike approaches that copy ivars, it also handles the case where nsButtonCellInstance is actually an instance of some weird subclass that happens to override the -alignment method, for example, to return a hard-coded value.

Thinking a little more about this, I wonder if you could take advantage of KVC not only for this case but in the general case of copying properties with the same name from one arbitrary object to another, assuming both objects are key-value coded. You could add a category to NSObject like this:

    - (void)copyProperties:(id)otherObject
    {
        for all keys in otherObject
            if I have a key of the same name
[self setValue:[otherObject valueForKey:key] forKey:key];
    }

There would be some trickiness if the type of a property does not match, but if you know you're passing a compatible object as otherObject this shouldn't be a problem in many cases. Also, note this only makes a shallow copy. And implementing the "for all keys" part might have to do some guesswork (or perhaps simply fail) if the object doesn't implement -classDescription. Note that I have only a shallow knowledge of KVC, so maybe I'm missing something that would make this simple.

I wonder if IB does something like this when you change the class of an object. For example, suppose you have two subclasses of NSTextField, MyTextField and MyOtherTextField. If you change an NSTextField to an instance of MyTextField, IB has to make an instance of MyTextField with all the NSTextField properties copied over. If you then change the class again to MyOtherTextField, IB has to make an instance of MyOtherTextField with the NSTextField properties -- and only those properties -- copied over.

--Andy

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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