2010-07-20 3 views
0

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

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

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

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

Cheers.

ответ

2

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

Ok вот мой 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 
+0

Я думаю, вы на что-то, но ваш ответ запутан, вы могли бы уточнить немного больше? – Rudiger

+0

Я добавил пример кода, я еще не тестировал его, но вам может потребоваться настроить его, чтобы он работал. –

+0

Спасибо, был сразу после немного уточнения, но код работает хорошо :) – Rudiger

2

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

+0

Key Value Coding используется для доступа к свойствам объекта, я не вижу способа помочь мне в этом случае – Rudiger

+0

Извините, я был в замешательстве от вашего неправильного использования термин «привязка ключевых значений» – willcodejavaforfood