我有一堆存储在NSArray中的NSDictionaries。字典存储按钮的坐标,它们的名称以及按下时加载的相关对象(UIView)。
当按下按钮时,我可以检索字符串格式的按钮,例如“设置”,然后我想运行对象 - (void)设置{}。
现在我知道如何使用if else语句来做这件事,但我想避免它们,因为它们很混乱并且认为Key Value Bindings会是这样但我不相信它们存在于iPhone上。
它们可以在iPhone上使用吗?即使在iOS4中,我读到的所有内容都没有。如果他们是我将如何实现这一点。如果没有,除了else语句之外还有更好的方法吗?我可以存储对UIView的引用来推入NSArray而不是字符串,如果是这样会影响性能吗?
干杯。
答案 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。这将让你通过使用字符串创建类并向它们发送消息。