关键价值绑定iPhone

时间:2010-07-20 06:04:23

标签: iphone uiview nsarray nsdictionary cocoa-bindings

我有一堆存储在NSArray中的NSDictionaries。字典存储按钮的坐标,它们的名称以及按下时加载的相关对象(UIView)。

当按下按钮时,我可以检索字符串格式的按钮,例如“设置”,然后我想运行对象 - (void)设置{}。

现在我知道如何使用if else语句来做这件事,但我想避免它们,因为它们很混乱并且认为Key Value Bindings会是这样但我不相信它们存在于iPhone上。

它们可以在iPhone上使用吗?即使在iOS4中,我读到的所有内容都没有。如果他们是我将如何实现这一点。如果没有,除了else语句之外还有更好的方法吗?我可以存储对UIView的引用来推入NSArray而不是字符串,如果是这样会影响性能吗?

干杯。

2 个答案:

答案 0 :(得分:2)

键值绑定在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

答案 1 :(得分:2)

如果要对类和方法进行运行时引用,则需要查看Objective-C Runtime Referenc e。这将让你通过使用字符串创建类并向它们发送消息。