Проблемы с настройкой FirstResponder в Какао Mac OSX - PullRequest
4 голосов
/ 01 сентября 2011

Я работаю над крошечным приложением, чтобы узнать какао, и мне трудно установить FirstResponder для некоторых NSTextFields.

Когда открывается представление, я хочу, чтобы был выбран первый NSTextField, clientNumber, поэтому я запускаю [clientNumber intoFirstResponder] в конце моего метода loadView, но он не выбирает текстовое поле. Но когда я нажимаю кнопку, которая запускает метод addToArray (IBAction), он выбирает правильное текстовое поле. Далее у меня есть еще одно текстовое поле, оно должно содержать только целые числа, поэтому у меня есть грубая проверка для него. Когда содержимое не является целым, я получаю звуковой сигнал, как и должно быть, но текстовое поле не выделяется.

Вот мой код:

- (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]; 
    }
}

Я действительно надеюсь, что кто-то может помочь мне здесь.

EDIT:

Я все понял неправильно, спасибо за указатели, но когда я исправляю код, использую это: FakturaAppDelegate * appDelegate = (FakturaAppDelegate *) [[NSApplication sharedApplication] делегат]; [appDelegate.window makeFirstResponder: self.invoiceCredit]; вместо стать первым ответчиком. Но это все еще не работает.

Ответы [ 5 ]

2 голосов
/ 27 ноября 2017

Переопределите viewDidAppear, и в указанном методе вызовите метод intoFirstResponder для NSTextField.

Обратите внимание, что в моей собственной работе viewWillAppear оказался слишком ранним для указанного вызова, независимо от того, используется ли метод intoFirstResponder в NSTextField или метод makeFirstResponder в NSWindow.

2 голосов
/ 01 сентября 2011

Вы делаете это намного сложнее, чем нужно.

В Интерфейсном Разработчике установите выход initialFirstResponder вашего окна так, чтобы он указывал на текстовое поле.

Вот и все.

Если вам абсолютно необходимо сделать это программно, используйте:

[window setInitialFirstResponder:yourTextField];

Помните, если вы боретесь с Какао, чтобы сделать что-то похожее на этодолжно быть просто, тогда вы, вероятно, делаете это неправильно.

0 голосов
/ 10 мая 2017

Никогда не пытайтесь установить первый респондент в методе viewDidLoad , потому что window все еще равен нулю в этой точке. Вместо этого используйте viewWillAppear:

- (void)viewWillAppear
{
    [super viewWillAppear];
    if (!_started) {
        _started = YES;
        [self.view.window makeFirstResponder:_yourView];
    }
}

Apple также однажды сказала, что вам никогда не следует напрямую вызывать становлениеFirstResponder. Используйте [yourWindow makeFirstResponder: yourView]; вместо.

0 голосов
/ 24 декабря 2016

Проблема в том, что self.view.window является нулевым в методе viewDidLoad первого контроллера представления до тех пор, пока не завершится applicationDidFinishLaunching. Таким образом, сталFirstResponder не работает в viewDidLoad. Попробуйте отложить настройку первого респондента, например, так:

[_ yourTextField executeSelector: @selector (intoFirstResponder) withObject: nil afterDelay: 0.1];

0 голосов
/ 01 сентября 2011

Просто прочитайте документацию:

becomeFirstResponder

Уведомляет получателя, что он собирается стать первый респондент в своем NSWindow.

[...]

Используйте NSWindow makeFirstResponder: метод, а не этот метод, чтобы сделать объект первым респондентом. Никогда не вызывайте этот метод напрямую.

...