代码之家  ›  专栏  ›  技术社区  ›  Rudiger

键值绑定

  •  0
  • Rudiger  · 技术社区  · 14 年前

    当按下按钮时,我可以检索哪个按钮是字符串格式的,例如“settings”,然后我想运行object-(void)settings{}。

    现在我知道如何使用if-else语句,但我想避免使用它们,因为它们很混乱,我认为键值绑定是一种方式,但我不相信它们在iPhone上存在。

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

    干杯。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Akash Kava    14 年前

    键值绑定在iOS中并不存在,但您必须手动执行。您可以创建一个从“Button”派生的类,您可以创建一个NSDictionary属性,您可以分配它,在分配时,您可以开始观察dictionary实例中的更改,并在委托中读取值并分配给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* 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
    
        2
  •  2
  •   willcodejavaforfood    14 年前

    如果你想做类和方法的运行时引用,你需要看看Objective-C Runtime Referenc