2014-12-15 2 views
0

У меня возникают трудности с настройкой табуляции для моих NSTextField.Пытается установить `setNextKeyView` на` NSTextField `в коде

В моей AppDelegate добавить NSViewController

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    CustomViewController *vc = [[CustomViewController alloc] init]; 
    [_window.contentView addSubview:vc.view]; 
    [_window setAutorecalculatesKeyViewLoop:NO]; 

    [_window.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:@{@"view":vc.view}]]; 
    [_window.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:@{@"view":vc.view}]]; 

} 

Тогда в моем NSViewController добавить заказные NSViews, которые содержат метку и текстовое поле.

- (void)viewDidLoad { 

    _customView = [[CustomView alloc] initWithLabel:@"Foo"]; 
    [self.view addSubview_customView]; 

    _customView1 = [[CustomView alloc] initWithLabel:@"Bar"]; 
    [self.view addSubview_customView1]; 

     _customView2 = [[CustomView alloc] initWithLabel:@"FooBar"]; 
    [self.view addSubview_customView2]; 

} 

И, наконец, у меня есть CustomView, который реализует поле метки и текст следующим образом:

- (void)initWithLabel:(NSString *)label { 

    self = [super initWithFrame:NSZeroRect]; 
    if (self) { 

     _label = [[NSTextField alloc] initWithFrame:NSZeroRect]; 
     _label.stringValue = label; 
     _label.font = [NSFont fontWithName:@"HelveticaNeue-Light" size:12.0f]; 
     _label.alignment = NSLeftTextAlignment; 
     _label.textColor = [NSColor grayColor]; 
     _label.selectable = NO; 
     _label.editable = NO; 
     _label.drawsBackground = NO; 
     _label.bezeled = NO; 
     [self addSubview:_label]; 

     _textField = [[NSTextField alloc] initWithFrame:NSZeroRect]; 
     _textField.stringValue = @""; 
     _textField.alignment = NSRightTextAlignment; 
     _textField.font = [NSFont fontWithName:@"HelveticaNeue-Light" size:32.0f]; 
     [self addSubview:_textField]; 

    } 
    return self; 
} 

я позиционирование с NSLayoutConstraints и все выглядит отлично и работает, как и ожидалось, за исключением того, когда я пытаюсь реализовать setNextKeyView:.

Я пытался сделать это с помощью открытой textField в viewDidLoad контроллера вида, как:

... 
[_customView.textField setNextKeyView:_customView1.textField]; 
[_customView1.textField setNextKeyView:_customView3.textField]; 
[_customView2.textField setNextKeyView:_customView.textField]; 
... 

Но это не сработало. При нажатии клавиши табуляции от NSTextField текущее поле теряет фокус, но следующий не получает его. Я также попытался позвонить [[[self view] window] recalculateKeyViewLoop], но это тоже не помогло.

Как мне это сделать? Я также играл с настройкой NSWindowsetAutorecalculatesKeyViewLoop: до YES, но это также не отразило эффект.

Благодаря

PS: это псевдо-код, чтобы упростить вещи. Если скобка отсутствует или есть опечатка, то это не моя проблема. Он отлично компилируется и работает. Просто табуляция не ведет себя так, как ожидалось. ;-)

+0

Если вы нажмете Tab еще, делает акцент в конце концов добраться до других текстовых полей? Кроме того, вы должны использовать '-initWithFrame:' ​​для инициализации суперкласса и 'NSTextField'. Я понимаю, что вы используете автоматическую компоновку, поэтому кадр будет переопределен, но он все еще является назначенным инициализатором. Вы можете передать 'NSZeroRect'. –

+0

Нет, он никогда не попадает в другие поля. Я изменил init на NSZeroRect. – Joseph

+0

Вы не изменили его для вызова '[super init]', по крайней мере, не в отредактированном коде. –

ответ

0

Как @Ken отметил в своем комментарии попробовать, как это: -

if ([_customView1.textField acceptsFirstResponder]) 
{ 
[_customView1.window makeFirstResponder:_customView1.textField] 
} 
+0

Вы не должны вызывать '-resignFirstResponder' или' -becomeFirstResponder' (кроме вызова «super' в переопределении). Это документировано для обоих методов. Вы можете сделать 'if ([_customView1.textField acceptsFirstResponder]) [_customView1.window makeFirstResponder: _customView1.textField];', но вам не нужно заменять/повторно реализовывать функциональные возможности цикла. Кроме того, безоговорочно возвращая «ДА» из этого метода, все текстовые поля будут разбиты на все остальные команды. –

+0

Спасибо за исправление sir –

+0

Нет, это не работает. Если фокус первый вид, но курсор не мигает в текстовом поле. Tabbing не влияет, за исключением того, что первое поле теряет фокус. – Joseph

 Смежные вопросы

  • Нет связанных вопросов^_^