NSPopUpButton: множественные значения и привязка selectedIndex - PullRequest
3 голосов
/ 03 июля 2011

Контекст:

У меня есть NSArrayController, связанный с Базовыми данными, который предоставляет строки для NSTableView. Когда пользователь выбирает строки, свойство selectedObjects arrayController изменяется.

Теперь каждый из этих selectedObjects - это объект Core Data с именем «LPFile», который имеет атрибут «style», который является целым числом от 0 до 3. Атрибут «style» должен соответствовать selectedIndex объекта NSPopUpButton.

Мой вопрос:

Если пользователь выбирает несколько строк, и файлы LPF, связанные с этими строками, имеют одинаковое значение для «стиля», я хотел бы, чтобы NSPopUpButton установил для своего свойства selectedIndex это значение. Если объекты строк имеют РАЗЛИЧНЫЕ значения для «стиля», то NSPopUpButton должен отображать пустую строку. (Когда пользователь выбирает стиль, эта пустая строка должна исчезнуть из NSPopUpButton.)

Я знаю, как этого добиться, написав код вручную, и если выбор был ограничен одной строкой, я мог бы настроить эти привязки, но как настроить привязки для обработки нескольких выбранных объектов, которые могут иметь или не иметь разные значения для "стиля"? Я немного погуглил, но не могу найти конкретную информацию, и я устал от экспериментов! (Примечание: я предоставляю элементы содержимого для NSPopUpButton в IB, поэтому я ничего не привязываю к привязкам содержимого кнопки.)

1 Ответ

2 голосов
/ 28 августа 2011

Возможно, вам придется написать немного кода, но вы все равно можете использовать привязки для управления элементами пользовательского интерфейса, в этом случае всплывающая кнопка.

Вот один из способов сделать это, который имеетработал для меня:

В контроллере, который предоставляет контент для контроллера массива, определите свойство, которое содержит набор индексов выбора, соответствующий выбору в табличном представлении.Свяжите его с набором индексов выбора контроллера массива, чтобы он всегда обновлялся и синхронизировался с табличным представлением.Для простоты я назвал его fileSelectionIndexSet следующим образом.

Затем определите свойство, обеспечивающее индекс для всплывающей кнопки.Ниже я назвал это styleIndex.

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

// Header file, just synthezise in implementation
@property (retain) NSInteger styleIndex;

Зарегистрируйте контроллер в качестве наблюдателя его собственного свойства fileSelectionIndexSet:

// It doesn't have to be awakeFromNib, any method will do if called before
// you need the functionality
-(void)awakeFromNib
{
    [self addObserver:self 
           forKeyPath: @"fileSelectionIndexSet" 
              options:NSKeyValueObservingOptionNew 
              context:NULL];             
}


- (void) observeValueForKeyPath:(NSString *)keyPath
                       ofObject:(id)object
                         change:(NSDictionary *)change
                        context:(void *)context
{
    if ( [keyPath isEqualToString: @"fileSelectionIndexSet"] ) 
    {
        NSInteger index;
        index = ... // Compute value based on current LPFile selection
        self.styleIndex = index;
    }
}

Реализация себякак наблюдатель своего собственного свойства делает свойство styleIndex односторонним, зависимым от fileSelectionIndexSet.

Это означает, что всякий раз, когда пользователь изменяет выбор в табличном представлении, всплывающая кнопка обновляется.Однако когда пользователь изменяет выбор в всплывающей кнопке, в табличном представлении ничего не меняется.

...