这是我的头脑…… 简化版本:我有两个文本字段 – 字段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”.只需存储其中一个.值变换器正是显示和接受另一个输入的方式.