我有一个tableView(这是一个包含大约11个字段的表单),tableViewController和一个我正用来作为表单模型的类的实例。 tableView控制器使用KVO更新模型。所以,而不是让11 IF IFSE语句比较我的观察值中的keypath字符串,如下所示 -
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keypath isEqualToSTring:@"name"]){
[self updateName];
}
else if([keypath isEqualToSTring:@"age"]){
[self updateAge];
}
etc,etc,etc...
}
我虽然拥有这样的东西会更简洁,只需遵循更新方法的命名约定
// KVO update methods name follow the naming convention "update<keypath>".
// The first character of the keypath should be capitalised.
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSString * firstCharacterOfKeyPath = [keyPath substringToIndex:1];
NSString * capitalisedFirstCharacterOfKeyPath = [firstCharacterOfKeyPath uppercaseString];
NSRange firstCharacterRange = NSMakeRange(0, 1);
NSString * capitalisedKeyPath = [keyPath stringByReplacingCharactersInRange:firstCharacterRange withString:capitalisedFirstCharacterOfKeyPath];
NSString * updateSelectorString = [[NSString alloc] initWithFormat:@"update%@",capitalisedKeyPath];
SEL updateSelector = NSSelectorFromString(updateSelectorString);
[self performSelector:updateSelector];
}
我不确定这是不是一种好的做法。
答案 0 :(得分:2)
我没有在您的代码中看到任何实际问题,但我已添加检查self
是否响应选择器,以防止进一步崩溃:
if ([self respondsToSelector:updateSelector])
{
[self performSelector:updateSelector];
}
但就个人而言,我并不喜欢KVO方法。我不想说这很糟糕,但它可能会产生不必要的错误。即你应该记得正确地删除观察者,这在UITableView的情况下可能不是很简单。
我建议在这里使用委托方法,即使它看起来有点复杂,但对我来说听起来更可靠。