当前位置 : 主页 > 手机开发 > 其它 >

Cocoa绑定中的循环依赖关系

来源:互联网 收集:自由互联 发布时间:2021-06-22
这是我的头脑…… 简化版本:我有两个文本字段 – 字段A和字段B.字段B可以从字段A派生,类似字段B可以从字段A派生. (还有几个其他字段与A或B组合产生多个TextLabels的数据) 我想要做的是
这是我的头脑……

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

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

我想要做的是:当用户更改字段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;
}

其中calculateFieldA和calculatedFieldB是进行转换的方法,valueOfFieldA和valueOfFieldB是绑定到两个文本字段的NSString.

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

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

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

编辑:

我可能需要澄清几点:

calculatedFieldA接受B值并返回A,也更新(通过setter方法)valueOfFieldA.
类似地,computedFieldB接受A值并返回B,也更新(通过setter方法)valueOfFieldB.

这是在Lion上,使用Xcode 4.1.

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