Как создать привязку для NSApp.dockTile's
-
03-07-2019 - |
Вопрос
В IB легко привязать метку или текстовое поле к keyPath некоторого контроллера.
NSDockTile (доступный через [[NSApp dockTile] setBadgeLabel: @ " 123 "]) не появляется в IB, и я не могу понять, как программно связать его " badgeLabel " свойство, как вы можете связать метку / текстовое поле / столбец таблицы.
Есть идеи?
Решение
NSDockTile не имеет никаких привязок, поэтому вашему контроллеру придется обновлять плитку док-станции вручную. Вы можете сделать это, используя KVO, который будет иметь тот же эффект, что и его привязка.
Создать контекст как глобальный:
static void* MyContext=(void*)@"MyContext";
Затем, в вашем методе init:
[objectYouWantToWatch addObserver:self forKeyPath:@"dockTileNumber" options:0 context:MyContext];
Затем вам нужно реализовать этот метод, чтобы получать уведомления об изменениях в пути к ключу:
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == MyContext) {
[[NSApp dockTile] setBadgeLabel:[object valueForKeyPath:keyPath]];
}
else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
Обязательно удалите наблюдателя, когда объект контроллера исчезнет.
Другие советы
Если NSDockTile поддерживает привязки, вы можете использовать метод bind: toObject: withKeyPath: options:
, чтобы установить привязки для свойства badgeLabel. Проверьте документацию для деталей, какие аргументы использовать. Если это не работает, вы можете либо реализовать наблюдение значения ключа в своем классе контроллера и обновлять метку при каждом изменении значения, либо даже переопределить NSDockTile для создания подкласса, совместимого с привязками.
Я пробовал множество вариантов bind: toObject: withKeyPath: options:
в NSDockTile, на контроллере, в источнике данных. Я не могу понять комбинацию, которая работает. Альтернативно, есть ли способ иметь объект BatchController, который может быть связан с источником данных, и он затем обновляет значок? Как взять объект NSO и сделать его привязываемым?