On Jun 15, 2011, at 08:56, Luc Van Bogaert wrote:

> I'm not sure I understand how to accomplish this. What I have already tried, 
> is message the window with "makeFirstResponder:" passing my view controllers 
> as a parameter. This initially seemed to work fine; until I add an extra view 
> with some textfields to the content pane. Now, it appears that my validation 
> method does not get called anymore, leading me to the conclusion that somehow 
> my view controllers are no longer part of the responder chain.
> 
> I used NSLog to find out the kind of object that is my window's "first 
> responder" and "next responder"; but the last method returns nil, which I 
> don't understand.

I think there's still a small confusion here. For each window, there's a tree 
structure of NSResponder objects with the window at the root and the views as 
intermediate and leaf nodes. The nodes of this tree are linked 
(uni-directionally) by the "nextResponder" property.

A responder chain is something a bit more complicated. It's a traversal of a 
chain of objects beginning with a NSView, following the "nextResponder" links 
to the window, then continuing with a succession of objects (window controller, 
document, application, etc) that depends on which kind of responder chain 
(mouse, keyboard, action, etc) is being traversed.

Creating a view controller does *not* link it into the window's tree of 
responders, and therefore the view controller is not part of the responder 
chain. The "no longer" in your comment above doesn't apply: it was never in the 
chain.

In your scenario, where the view controller is playing little brother to the 
window controller -- is implementing and validating action methods -- it needs 
to be inserted manually into the tree of responders so that it *will* appear in 
the responder chain.

For example, you can do it in the 'loadView' override of a NSViewController 
subclass:

> - (void) loadView
> {
>       [super loadView];
>       
>       //      Insert this view controller into the responder chain
>       
>       NSResponder* nextResponder = self.view.nextResponder;
>       self.view.nextResponder = self;
>       self.nextResponder = nextResponder;
>       
> }



_______________________________________________

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