Привязки «ключ-значение» iPhone

У меня есть куча NSDictionaries, которые хранятся в NSArray. В словарях хранятся координаты кнопок, их имена и связанные с ними объекты для загрузки при нажатии (UIView).

Когда кнопка нажата, я могу получить, какая кнопка находится в строковом формате, например, «настройки», и я хотел бы затем запустить объект -(void)settings{}.

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

Доступны ли они на iPhone? Все, что я читал, говорит «нет» даже в iOS4. Если они есть, как бы я это реализовал. Если нет, есть ли лучший способ сделать это, кроме утверждений if else? Могу ли я сохранить ссылку на UIView для отправки в NSArray вместо строки, и если да, то повлияет ли это на производительность?

Ваше здоровье.


person Rudiger    schedule 20.07.2010    source источник


Ответы (2)


Связывание ключевого значения существует в iOS, но вам придется делать это вручную. Вы можете создать класс, производный от «Кнопки», и вы можете создать свойство NSDictionary, которое вы можете назначить, и во время назначения вы можете начать наблюдать за изменениями в экземпляре словаря, а в делегате вы можете прочитать значение и присвоить себе.

Хорошо, вот мой файл button.h

@interface MyCustomButton : NSButton

NSDictionary* store;

@end

-(NSDictionary*) store;
-(void) setStore: (NSDictionary*) v;

а вот мой файл button.m

@implementation MyCustomButton


-(void) dealloc{
   [self setStore: nil];
   [super dealloc];
}

-(void) loadValues:{
   // fill your loading values here
   // this is not correct you may need
   // to see help to get correct names of
   // function
   [self setText: [store stringForKey:@"buttonLabel"]];
}

-(void) setStore: (NSDictionary*) v{
   if(store!=nil){
      [store removeObserver: self forKeyPath:@"buttonLabel"];
      [store removeObserver: self forKeyPath:@"buttonX"];
      [store removeObserver: self forKeyPath:@"buttonY"];
      [store release];
   }
   if(v==nil)
      return;
   store = [v retain];
   [store addObserver: self forKeyPath:@"buttonLabel" options:0 context:nil];
   [store addObserver: self forKeyPath:@"buttonX" options:0 context:nil];
   [store addObserver: self forKeyPath:@"buttonY" options:0 context:nil];

   [self loadValues];
}

-(NSDictionary*) store{
   return [store autorelease];
}

-(void) observeValueForKeyPath: (NSString*) keyPath 
   ofObject:(id)object 
   change:(NSDictionary*)change 
   context:(void*)context{
   // here you can identify which keyPath 
   // changed and set values for yourself
   [self loadValues];
}
@end

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

MyButton* button = [[[MyButton alloc] init] autorelease];

// add button to view...

[button setStore: myDictionary];
// from this point onwards button will automatically
// change its properties whenever dictionary
// is modified
person Akash Kava    schedule 20.07.2010
comment
Я думаю, вы что-то поняли, но ваш ответ сбивает с толку, не могли бы вы уточнить немного больше? - person Rudiger; 21.07.2010
comment
Я добавил пример кода, я еще не тестировал его, но вам может потребоваться настроить его, чтобы он заработал. - person Akash Kava; 21.07.2010
comment
Спасибо, это было только после небольшого уточнения, но код тоже работает хорошо :) - person Rudiger; 22.07.2010

Если вы хотите сделать справочник классов и методов во время выполнения, вам нужно взглянуть на Objective-C Справочник по времени выполненияe. Это позволит вам с помощью строк создавать классы и отправлять им сообщения.

person willcodejavaforfood    schedule 20.07.2010
comment
Кодирование значения ключа используется для доступа к свойствам объекта, я не вижу, как это могло бы помочь мне в этом случае. - person Rudiger; 21.07.2010
comment
Извините, я был сбит с толку вашим неправильным использованием термина привязка значения ключа. - person willcodejavaforfood; 21.07.2010