2012-05-22 5 views
0

Я реализовал представление табулатуры как подкласс NSControl.Подкласс NSControl не должен меняться firstResponder

enter image description here

Когда я щелкаю его, AppKit попытается обновить firstResponder моего NSWindow. Поскольку я не хочу, чтобы таба стала firstResponder (acceptsFirstResponder возвращает NO), NSWindow станет firstResponder. Моя цепочка ответчиков будет состоять из окна и его контроллера, и никакие сообщения о действиях не будут доставлены в подвью под вкладкой (NSOutlineView). Я хотел бы, чтобы NSOutlineView продолжал получать сообщения о действии и события, когда я нажимаю на вкладку.

Каким образом это можно сделать? Невозможно ли остановить NSView от попытки изменить firstResponder при нажатии?

Я думал об установке панели инструментов nextResponder в NSOutlineView, но вручную изменение nextResponder NSView не рекомендуется Apple.

ответ

0

Я закончил вручную сброс firstResponder на вид схемы в реализации метода делегата моего вкладчика.

Другое решение, которое я придумал, реализует это на вкладке, чтобы сбросить firstResponder на исходный объект, если таба становится firstResponder.

- (void)awakeFromNib { 
    [self.window addObserver:self 
        forKeyPath:@"firstResponder" 
        options:NSKeyValueObservingOptionOld 
        context:nil]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
         change:(NSDictionary *)change context:(void *)context { 
    NSResponder *oldResponder = [change objectForKey:NSKeyValueChangeOldKey]; 
    if (self.window.firstResponder == self) { 
     [self.window makeFirstResponder:oldResponder]; 
    } 
}