Ключевые значения iPhone - PullRequest
0 голосов
/ 20 июля 2010

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

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

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

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

Приветствие.

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

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

2 голосов
/ 20 июля 2010

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

Хорошо, вот мой файл 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
...