Привязка к методу класса в Какао? - PullRequest
3 голосов
/ 20 апреля 2011

Если у меня есть такой метод, как:

@interface CharacterSet
    + (NSArray *)allCharacterSets;
@end

Могу ли я связать его с помощью привязок Какао?

Я пытаюсь подключить к нему значения содержимого NSComboBox.Когда я ввожу CharacterSet.allCharacterSets в поле «Путь к ключу модели» в IB, он не работает, говоря:

[addObserver: forKeyPath: @ «CharacterSet.allCharacterSets» опции: контекст 0x0:0x200275b80] был отправлен объекту, который не совместим с KVC для свойства CharacterSet.

Я не уверен, что еще можно попробовать.В настоящее время я должен сохранить возвращаемое значение allCharacterSets в ivar в своем контроллере (или в отдельном окне), чтобы заставить его работать, что кажется дополнительным шагом, который мне не нужно было делать.

Ответы [ 2 ]

5 голосов
/ 06 октября 2011

Я работаю над огромным приложением, и упомянутые вами дополнительные шаги стали для меня настоящей болью в заднице.Поэтому я разработал небольшой прокси-класс, который обрабатывает привязки методов класса.

Сначала я добавил небольшой прокси-класс

@implementation INClassProxy

- (id)valueForUndefinedKey:(NSString *)key {
    return NSClassFromString(key);
}

@end

Затем добавил средство доступа к категории в NSApplication

- (id)classProxy {
    static INClassProxy *proxy = nil;
    if (proxy == nil)
        proxy = [[INClassProxy alloc] init];
    return proxy;
}

(я фактически добавил это к моему делегату приложения и реализовал application: DelegateHandlesKey: )

Теперь вы готовы связывать методы класса с объектом Application, даже в конструкторе интерфейса,с ключом @"classProxy.CharacterSet.allCharacterSets".

0 голосов
/ 19 апреля 2013

@ cocoafan .. Я понял в своем исчерпывающем комментарии ... что приведенный мною пример может не сработать, если вы на самом деле не реализуете свой ответ GENIUS, как я выбрал ... Чтобы сделать этот умопомрачительно блестящим (такжекак просто) магия, еще более универсальная и полезная… Я просто создал базовый класс, как вы описали, но вместо того, чтобы классифицировать (это так называется?) NSApplication, я сделал это на NSObject.Полный пример ниже…

@interface AZClassProxy : NSObject
@end
@interface NSObject (AZClassProxy)
- (id)classProxy;
@end

@implementation AZClassProxy
- (id) valueForUndefinedKey:(NSString*)k { return NSClassFromString(k); }
@end
@implementation NSObject (AZClassProxy)
- (id) classProxy { static AZClassProxy *prx = nil; return prx = prx ?: AZClassProxy.new; }
@end

bound by class

Правка… Через 2 дня мой простой ум сложился, пытаясь вспомнить, кто это работает, ипочему это так чудесноЯ буду продолжать публиковать здесь, поскольку я должен делать вещи, чтобы напомнить себе о том, что это такое, и почему я должен заботиться .. Итак, основной пример ..

NSObject *WHATEVS = NSObject.new;
NSLog(@"%@", [[WHATEVS.classProxy valueForKey:@"NSColor"] redColor]);

LOG NSCalibratedRGBColorSpace 1 0 0 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...