4

私はココアを学ぶためだけに小さなアプリに取り組んでおり、FirstResponderをいくつかのNSTextFieldsに設定するのに苦労しています。

ビューが開いたら、最初のNSTextFieldであるclientNumberを選択する必要があるため、loadViewメソッドの最後で[clientNumber beenFirstResponder]をトリガーしますが、テキストフィールドは選択されません。しかし、(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 *)[[NSApplicationsharedApplication]デリゲート]; [appDelegate.window makeFirstResponder:self.invoiceCredit]; 代わりにbecomeFirstResponder。しかし、それでも機能しません。

4

5 に答える 5

3

あなたはこれを必要以上に難しくしています。

Interface BuilderでinitialFirstResponder、ウィンドウのアウトレットをテキストフィールドを指すように設定します。

それでおしまい。

どうしてもプログラムで実行する必要がある場合は、次を使用してください。

[window setInitialFirstResponder:yourTextField];

簡単なはずのことをするためにCocoaと戦っている場合は、おそらく間違っていることを覚えておいてください。

于 2011-08-31T23:51:21.463 に答える
2

viewDidAppearをオーバーライドし、上記のメソッド内で、NSTextFieldのbecomeFirstResponderメソッドを呼び出します。

私自身の仕事では、NSTextFieldのbecomeFirstResponderメソッドを使用するかNSWindowのmakeFirstResponderメソッドを使用するかにかかわらず、viewWillAppearは上記の呼び出しには時期尚早であることが証明されていることに注意してください。

于 2017-11-27T12:34:51.403 に答える
0

問題は、applicationDidFinishLaunchingが終了するまで、最初のViewControllerのviewDidLoadメソッドでself.view.windowがnullになることです。したがって、becomeFirstResponderはviewDidLoadでは機能しません。次のように、ファーストレスポンダーの設定を遅らせてみてください。

[_yourTextField PerformSelector:@selector(becomeFirstResponder)withObject:nil afterDelay:0.1];

于 2016-12-24T03:43:09.553 に答える
0

この時点ではウィンドウがまだnilであるため、 viewDidLoadメソッドでファーストレスポンダーを設定しようとしないでください。代わりにviewWillAppearを使用してください。

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

Appleはかつて、becomeFirstResponderを直接呼び出すべきではないと言っていました。[yourWindow makeFirstResponder:yourView]を使用します; 代わりは。

于 2017-05-10T01:45:13.867 に答える
-1

ドキュメントを読んでください:

ファーストレスポンダーになります

NSWindowでファーストレスポンダーになりそうなことを受信者に通知します。

[...]

このメソッドではなく、NSWindow makeFirstResponder:メソッドを使用して、オブジェクトをファーストレスポンダーにします。このメソッドを直接呼び出さないでください。

于 2011-08-31T22:31:40.520 に答える