Jag antar att du har någon sorts controllerobjekt för fönstret du har dina textfält i. Det objektet passar utmärkt att använda som delegat för fälten.
I Interface Builder, control-dra från varje textfält till ditt controllerobjekt och anslut dem till outleten "delegate". Det här gör att ditt objekt blir fältens delegat. I IB bör du också sätta upp din kedja av key views, så att den hoppar till rätt fält senare. Dra först en connection från fönstret till det första textfältet, anslut det till fönstrets outlet "initialFirstResponder". Det här är fältet som ska ha fokus när fönstret först öppnas. Dra sedan en connection från det fältet till nästa fält, anslut "nextKeyView". Gör samma sak med resten av textfälten. På det sista fältet, dra en connection till det första, anslut "nextKeyView".
I ditt controllerobjekt lägger du sedan till den här koden:
- (void)controlTextDidChange:(NSNotification *)notification {
NSTextField *textField;
textField = [notification object];
if([[textField stringValue] length] == 1)
[[self window] makeFirstResponder:[textField nextKeyView]];
}
Det här implementerar metoden -controlTextDidChange:. När man skriver i textfälten kommer de kolla om de har en delegat och om delegaten svarar på den metoden, vilket du gör, alltså körs den. Vi får textfältet i NSNotifications -object och plockar ut det. Kollar sedan längden på strängen och om den är ett, ber fönstret flytta fokus till nästa textfält.