I'm not sure how I would get NSToolbar to use my subclass of NSToolbarView. I 
can't set the class of the toolbar *view* itself in IB (nor programatically, as 
far as I know), because NSToolbarView is a private class that NSToolbar uses to 
implement the UI. I can of course change the class of the NSToolbar object 
itself to a subclass, but this wouldn't help me much as there is no public 
NSToolbar method that allows me to change the class of its view. 

On 2011-08-25, at 9:35 PM, Quincey Morris wrote:

> On Aug 25, 2011, at 19:48 , Indragie Karunaratne wrote:
> 
>> Based on Corbin's tip, I overrode -hitTest: on NSToolbarView to call 
>> NSView's implementation instead and suddenly everything works. I expected 
>> something to break in NSToolbarView from doing this, but I've tested pretty 
>> thoroughly and there seem to be no issues. I don't know exactly how 
>> dangerous this is because I don't know what NSToolbarView's implementation 
>> of hitTest: is, but so far no issues.
>> 
>> @interface NSToolbarView : NSView
>> @end
>> 
>> @interface NSToolbarView (RightMouse)
>> @end
>> 
>> @implementation NSToolbarView (RightMouse)
>> 
>> - (void)hitTest:(NSPoint)aPoint
>> {
>>    [super hitTest:aPoint];
>> }
>> 
>> @end
>> 
>> That said, would my application get rejected from the Mac App Store for 
>> overriding *public* methods of a *private* class via a category? I could 
>> achieve the same result by checking the class and swizzling NSView's 
>> implementation of -hitTest:, but if I could get away with this it would be a 
>> lot easier (and cleaner).
> 
> I think it's a misstatement to say that you "overrode" 'hitTest:'. In Obj-C, 
> overriding conventionally means supplying a subclass implementation that 
> takes the place of the superclass implementation. What you actually did was 
> to *replace* 'hitTest:'. However, if you want to treat this as a quibble over 
> usage, that's fine.
> 
> The real problem with your approach is that it's a bit dangerous. You don't 
> *know* that NSToolbarView's own override of 'hitTest:' isn't itself 
> implemented in a category. If it is, then you are competing for the role of 
> replacer, and you might lose.
> 
> A better approach (if it's possible -- which it may not be if IB makes things 
> hard for you) is to subclass NSToolbarView, and change the toolbar's class in 
> IB after adding it to the window. (If you're creating the toolbar entirely 
> programmatically, it's more straightforward, of course.) Then you can 
> *really* override 'hitTest:', in the normal subclass way.
> 
> Finally, although you haven't seen any side effects of throwing away the 
> NSToolbarView implementation of 'hitTest:', which is what the above code 
> does, you don't know what else you might have broken. It would be safer to 
> put code in your override to test directly for your custom toolbar item view, 
> and send the message directly to your view if it's the one under the mouse. 
> If not, call the NSToolbarView method, not the NSToolbarView super method. 
> Again, this is easiest to do if you're actually using a NSToolbarView 
> subclass.
> 
> 

_______________________________________________

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 arch...@mail-archive.com

Reply via email to