Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Keyboard Loop in Programmatically Created Window



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:
http://lists.apple.com/mailman/options/cocoa-dev/email@hidden

This email sent to email@hidden


Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2007 Apple Inc. All rights reserved.