Как обновить NSPathControl с путем к выбранной ячейке в NSBrowser

Мне нужно обновлять NSPathControl с текущим выбранным путем в NSBrowser, но у меня возникают проблемы с определением способа получения уведомлений, когда путь изменился из NSBrowser. Идеальным способом сделать это было бы просто наблюдать путь ключа пути в NSBrowser, но это дает KVO возможность наблюдать только методы set<key>, которые возвращают пустое сообщение и не обновляются (setPath возвращает логическое значение успеха).

Я также пытался отслеживать путь ключа selectedCell, но я не получаю уведомлений, когда выбор там изменяется.

Есть ли какой-то другой действительно очевидный способ сделать это, который мне не хватает?


person Lawrence Johnston    schedule 09.12.2008    source источник


Ответы (3)


Предоставлено Робом Кенигером с Cocoa Dev:

Вы видели пример SimpleBrowser в /Developer/Examples? Он показывает, как получить текущий выбор, когда он изменен пользователем, в основном, просто настроив действие NSBrowser.

Это действительно способ сделать это. Просто реализуйте метод - (void)broswerClicked: (включая сопоставление его в построителе интерфейса) с тем, что вы хотите, чтобы происходило каждый раз, когда выбор изменяется внутри этого метода, например.

- (void)browserClicked:(id)browser {
    self.pathToSelectedCell = [browser path]; // NSPathControl is bound to pathToSelectedCell
}
person Lawrence Johnston    schedule 10.12.2008

Я только что проверил в IB, и похоже, что NSBrowser имеет привязку пути индекса выбора (массив объектов NSIndexPath), который вы могли бы отслеживать с помощью KVO. Это странно, но я не вижу никаких упоминаний об этом в документах, поэтому вам, возможно, придется провести небольшое исследование, чтобы увидеть, следует ли вам это использовать или не следует, даже если это работает. Если это так, в вашем методе наблюдения KVO вы найдете текущий путь браузера и преобразуете его в NSURL, который может использовать элемент управления путем.

Если это не сработает, есть также методы делегата - (BOOL)browser:(NSBrowser *)sender selectRow:(NSInteger)row inColumn:(NSInteger)column и - (BOOL)browser:(NSBrowser *)sender selectCellWithString:(NSString *)title inColumn:(NSInteger)column.

person Marc Charbonneau    schedule 10.12.2008
comment
К сожалению, этот метод делегата вызывается только в ответ на selectRow:inColumn: отправку в браузер. Если я устанавливаю привязку к путям индекса выбора, то методы делегата NSBrowser больше не вызываются, поэтому я не могу настроить свой браузер. - person Lawrence Johnston; 10.12.2008

Начиная с 10.6, можно узнать, какие элементы выбраны, используя обратный вызов делегата следующим образом:

- (NSIndexSet *)browser:(NSBrowser *)browser selectionIndexesForProposedSelection:(NSIndexSet *)proposedSelectionIndexes inColumn:(NSInteger)column
{
    NSLog(@"New first item of the new selection is at index %@", [proposedSelectionIndexes firstIndex]);
    // Do something with the selected index or indicies
    return proposedSelectionIndexes; // Allow the selection to occur by not changing this
}
person matt    schedule 06.03.2013