Cocoa绑定中的循环依赖关系

时间:2011-08-24 13:02:46

标签: cocoa cocoa-bindings

这是我的头脑......

简化版:我有两个文本字段 - 字段A和字段B.字段B可以从字段A派生,类似字段B可以从字段A派生。

(还有几个其他字段与A或B组合产生多个TextLabel的数据)

我想要做的是:当用户更改字段A时,字段B会更新,反之亦然。

所以我创建了两个方法,将A到B和B做到A.并定义了依赖关系,如:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
  NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];


  if ([key isEqualToString:@"calculatedFieldA"]) {
      NSSet *dependentKeys = [NSSet setWithObjects:@"valueOfFieldB", nil];
      keyPaths = [keyPaths setByAddingObjectsFromSet:dependentKeys];        
  }

  if ([key isEqualToString:@"calculatedFieldB"]) {
      NSSet *dependentKeys = [NSSet setWithObjects:@"valueOfFieldA", nil];
      keyPaths = [keyPaths setByAddingObjectsFromSet:dependentKeys];        
  }

  return keyPaths;
}

calculatedFieldAcalculatedFieldB是执行转换的方法,valueOfFieldAvalueOfFieldB是绑定到两个文本字段的NSString。

如果我删除了第二个if语句,它可以工作(但只有一种方式,B会在A更改时更新)。当第二个if被定义时,它只是炸弹,因为(我认为)它看到A更新所以去更新B,然后因为B更新,再次更新A等等...... < / p>

实现此循环依赖的最佳方法是什么?是时候开始阅读ValueTransformers了吗?

PS。我是一个Cocoa新手,所以请耐心等待,如果这是一个非常微不足道的问题,请不要太努力......

修改

我可能需要澄清几点:

calculatedFieldA接受B值并返回A,也更新(通过setter方法)valueOfFieldA。 同样地,calculatedFieldB接受A值并返回B,也更新(通过setter方法)valueOfFieldB

这是在Lion上,使用Xcode 4.1。

1 个答案:

答案 0 :(得分:1)

价值变形金刚几乎肯定是正确答案。不要存储“A”和“B”。只需存储其中一个。值变换器正是显示和接受另一个输入的方式。