2008 05 23What's IB connecting to when you connect to First Responder ?
When first using Interface Builder, I was quite dumbfounded by the First Responder box sitting here.
What the hell is that '1' for ? Turns out it works almost like event bubbling in Javascript.
- Event Bubbling when clicking an element on a page, the browser looks for
onclickon that element. If not found, the browser goes up its ancestors until it finds anonclickit can respond to. If no handler is found, the browser uses its ownonclickhandler. - Responder chain when clicking an object in a window, Cocoa looks up
actionon that object. If that object has a target, that's like calling (in JS)clickedObject.target[clickedObject.action](clickedObject)(Sending itself as parameter, likeevent.target) — that's Target/Action in Cocoa terms. But if that object has notarget, Cocoa goes up the responder chain to find an object that it can call its action on. If not found, you'll hear that default buzzing sound.
In JS we have a fixed name message searched up ; in Cocoa we have a variable name message searched up. Why ? To give each link in the chain a chance to handle the message. When selecting copy in the Edit menu, an action called copy: is sent down the chain. If NSTextField handles it, it copies its text to the pasteboard. If your control handles it, you get a chance to put whatever you want on the pasteboard. Another use is when using multiple NIBs (or a document based app) the first responder can be used to call methods on the application delegate, the last link of the responder chain.
NSButton to myFancyMethod: in the first responder, Interface Builder will actually be setting your button's action property to myFancyMethod:. In the NIB it's connected to nothing — the 'connection' happens at runtime.