Keyboard Loop in Programmatically Created Window
Keyboard Loop in Programmatically Created Window
- Subject: Keyboard Loop in Programmatically Created Window
- From: Jerry Krinock <email@hidden>
- Date: Sat, 31 Mar 2007 22:14:54 -0700
I've created a window programmatically (no Interface Builder, no
nib). In order to get the "tabbing" to work, I've set its
initialFirstResponder, firstResponder, and nextKeyViews of three
buttons, closing the loop at the end.
Result: The initialFirstResponder gets focus when the window appears
as desired, but the tabbing doesn't work. Searching list archives
shows others with similar problem, no solutions.
Here is the code that I use to verify that the loop is set up correctly:
NSView* r ;
r = [window initialFirstResponder] ;
NSLog(@"initialFirstResponder = %x %@", r, [(NSButton*)r title]) ;
r = (NSView*)[window firstResponder] ;
NSLog(@"firstResponder = %x %@", r, [(NSButton*)r title]) ;
r = [r nextKeyView] ;
NSLog(@"secondResponder = %x %@", r, [(NSButton*)r title]) ;
r = [r nextKeyView] ;
NSLog(@"thirdResponder = %x %@", r, [(NSButton*)r title]) ;
r = [r nextKeyView] ;
NSLog(@"fourthResponder = %x %@", r, [(NSButton*)r title]) ;
And the resulting console log:
initialFirstResponder = 15e720a0 Keep securely in my Keychain.
firstResponder = 15e720a0 Keep securely in my Keychain.
secondResponder = 15e387a0 Cancel
thirdResponder = 15e12300 OK
fourthResponder = 15e720a0 Keep securely in my Keychain.
which all looks cool to me; you see the fourthResponder is actually
the same as the firstResponder, indicating that the loop is closed.
Does anyone know what else I need to do?
Jerry Krinock
Here's all the code:
@interface NSView (KeyboardLooping)
- (void)makeNextKeyViewOfWindow:(NSWindow*)window
firstResponder:(NSView**)hdlFirstResponder
previousResponder:(NSView**)hdlPreviousResponder ;
@end
@implementation NSView (KeyboardLooping)
- (void)makeNextKeyViewOfWindow:(NSWindow*)window
firstResponder:(NSView**)hdlFirstResponder
previousResponder:(NSView**)hdlPreviousResponder {
if (!*hdlFirstResponder) {
if ([window makeFirstResponder:self]) {
[window setInitialFirstResponder:self] ;
*hdlFirstResponder = self ;
*hdlPreviousResponder = self ;
}
}
else {
[*hdlPreviousResponder setNextKeyView:self] ;
*hdlPreviousResponder = self ;
}
}
@end
// Set up the keyboard loop for tabbing
// In this example, the thirdButton and helpButton are nil
// But it still works since messages to nil are ignored.
NSView* firstResponder = nil ;
NSView* previousResponder = nil ;
NSView* responder = nil ;
responder = checkbox ;
[responder makeNextKeyViewOfWindow:window
firstResponder:&firstResponder
previousResponder:&previousResponder] ;
responder = helpButton ;
[responder makeNextKeyViewOfWindow:window
firstResponder:&firstResponder
previousResponder:&previousResponder] ;
responder = secondButton ;
[responder makeNextKeyViewOfWindow:window
firstResponder:&firstResponder
previousResponder:&previousResponder] ;
responder = thirdButton ;
[responder makeNextKeyViewOfWindow:window
firstResponder:&firstResponder
previousResponder:&previousResponder] ;
responder = firstButton ;
[responder makeNextKeyViewOfWindow:window
firstResponder:&firstResponder
previousResponder:&previousResponder] ;
[responder setNextKeyView:firstResponder] ; // Close the loop
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden