FROM : Andy Lee
DATE : Fri May 02 16:53:46 2008
Delegate methods aren't sent at all unless the delegate implements
them. I think your delegate is going to have to implement all
possible delegate methods and then forward them *if* the old delegate
implements them, and otherwise return an appropriate default value if
there is a return value.
This means the application will send all possible delegate methods to
you, as opposed to just the ones the old delegate implements, but
hopefully that won't cause any problems. I suppose you could do some
low-level hacking where you detect which methods the old delegate
implements and then remove unneeded methods from your delegate class.
--Andy
On May 2, 2008, at 10:35 AM, Matthew Gertner wrote:
> Hi,
>
> I am implementing an application delegate for a framework (Mozilla)
> that already registers its own delegate internally. Ideally I would
> like to be able to handle specific delegate messages in my class (in
> this case adding items to the dock tile menu) and forward all other
> invocations to the old delegate. So before I call [[NSApplication
> sharedApplication] setDelegate] for my delegate, I retrieve the
> existing delegate and save it in a member variable (mOldDelegate). I
> thought that I could get invocations to forward automatically like
> this:
>
> - (void)forwardInvocation:(NSInvocation *)anInvocation
> {
> if ([mOldDelegate respondsToSelector:[anInvocation selector]])
> [anInvocation invokeWithTarget:mOldDelegate];
> else
> [super forwardInvocation:anInvocation];
> }
>
> - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
> {
> if ([mOldDelegate respondsToSelector:aSelector])
> return [mOldDelegate methodSignatureForSelector:aSelector];
> else
> return [super methodSignatureForSelector: aSelector];
> }
>
> For some reason neither methodSignatureForSelector nor
> forwardInvocation is ever called. Perhaps this has something to do
> with the way messages are sent to the delegate by the application. As
> a result, my delegate never forwards to the old delegate. Any guidance
> would be appreciated.
>
> Matt
> _______________________________________________
>
> Cocoa-dev mailing list (<email_removed>)
>
> 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/<email_removed>
>
> This email sent to <email_removed>
DATE : Fri May 02 16:53:46 2008
Delegate methods aren't sent at all unless the delegate implements
them. I think your delegate is going to have to implement all
possible delegate methods and then forward them *if* the old delegate
implements them, and otherwise return an appropriate default value if
there is a return value.
This means the application will send all possible delegate methods to
you, as opposed to just the ones the old delegate implements, but
hopefully that won't cause any problems. I suppose you could do some
low-level hacking where you detect which methods the old delegate
implements and then remove unneeded methods from your delegate class.
--Andy
On May 2, 2008, at 10:35 AM, Matthew Gertner wrote:
> Hi,
>
> I am implementing an application delegate for a framework (Mozilla)
> that already registers its own delegate internally. Ideally I would
> like to be able to handle specific delegate messages in my class (in
> this case adding items to the dock tile menu) and forward all other
> invocations to the old delegate. So before I call [[NSApplication
> sharedApplication] setDelegate] for my delegate, I retrieve the
> existing delegate and save it in a member variable (mOldDelegate). I
> thought that I could get invocations to forward automatically like
> this:
>
> - (void)forwardInvocation:(NSInvocation *)anInvocation
> {
> if ([mOldDelegate respondsToSelector:[anInvocation selector]])
> [anInvocation invokeWithTarget:mOldDelegate];
> else
> [super forwardInvocation:anInvocation];
> }
>
> - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
> {
> if ([mOldDelegate respondsToSelector:aSelector])
> return [mOldDelegate methodSignatureForSelector:aSelector];
> else
> return [super methodSignatureForSelector: aSelector];
> }
>
> For some reason neither methodSignatureForSelector nor
> forwardInvocation is ever called. Perhaps this has something to do
> with the way messages are sent to the delegate by the application. As
> a result, my delegate never forwards to the old delegate. Any guidance
> would be appreciated.
>
> Matt
> _______________________________________________
>
> Cocoa-dev mailing list (<email_removed>)
>
> 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/<email_removed>
>
> This email sent to <email_removed>
| Related mails | Author | Date |
|---|---|---|
| Matthew Gertner | May 2, 16:35 | |
| Graham Cox | May 2, 16:44 | |
| Andy Lee | May 2, 16:53 | |
| Andy Lee | May 2, 16:55 | |
| Matthew Gertner | May 2, 16:55 | |
| Matthew Gertner | May 2, 16:56 | |
| Bill Cheeseman | May 2, 17:04 | |
| Graham Cox | May 2, 17:18 |






Cocoa mail archive

