objective-c – 在Cocoa Mac OSX中设置FirstResponder的问题

我正在研究一个小应用程序只是为了学习可可,我很难将FirstResponder设置为某些NSTextFields.

当视图打开时,我想要选择第一个NSTextField,clientNumber,所以我在loadView方法的末尾触发[clientNumber becomeFirstResponder],但是它没有选择文本字段.
但是,当我单击触发(IBAction)addToArray方法的按钮时,它会选择正确的文本字段.我还有另一个文本字段,它应该只包含整数,所以我有一个粗略的验证.当内容不是int时,我会发出一声嘟嘟声,就像它应该的那样,但它不会选择文本字段.

这是我的代码:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
      NSLog(@"initWithNibName");
    }
    return self;
}

- (void)viewWillLoad {
    NSLog(@"viewWillLoad");
}

- (void)viewDidLoad {
    NSLog(@"viewDidLoad");
    [self initNewInvoice];    
}

- (void)loadView {
    NSLog(@"loadView");
    [self viewWillLoad];
    [super loadView];
    [self viewDidLoad];
    FakturaAppDelegate *appDelegate = (FakturaAppDelegate *)[[NSApplication sharedApplication] delegate]; 
    [appDelegate.window makeFirstResponder:self.clientNumber]; 
}

- (void)awakeFromNib
{
    NSLog(@"awakeFromNib");
}

- (IBAction)saveInvoice:(id)sender
{
    FakturaAppDelegate *appDelegate = (FakturaAppDelegate *)[[NSApplication sharedApplication] delegate]; 
    [appDelegate.window makeFirstResponder:self.invoiceCredit]; 
}

- (IBAction)addToArray:(id)sender
{
    [clientNumber setStringValue: @"Toodeloo"];
    FakturaAppDelegate *appDelegate = (FakturaAppDelegate *)[[NSApplication sharedApplication] delegate]; 
    [appDelegate.window makeFirstResponder:self.clientNumber];  
}

- (IBAction)updateCreditDays:(id)sender
{
    if(invoiceCredit.intValue){
        [self updateCredit];
    }else{
        NSBeep();
        FakturaAppDelegate *appDelegate = (FakturaAppDelegate *)[[NSApplication sharedApplication] delegate]; 
    [appDelegate.window makeFirstResponder:self.invoiceCredit]; 
    }
}

我真的希望有人可以帮助我.

编辑:

我完全错了,感谢指针,但是当我修复代码时,使用这个:
    FakturaAppDelegate * appDelegate =(FakturaAppDelegate *)[[NSApplication sharedApplication] delegate];
    [appDelegate.window makeFirstResponder:self.invoiceCredit];
而不是成为第一个响应者.但它仍然无法奏效.

最佳答案 你正在努力实现这一目标.

在Interface Builder中,将窗口的initialFirstResponder出口设置为指向文本字段.

而已.

如果您绝对必须以编程方式执行此操作,请使用:

[window setInitialFirstResponder:yourTextField];

记住,如果你和Cocoa一起做一些看起来应该很简单的事情,那么你可能做错了.

点赞