e.J*_*mes 2 cocoa properties accessor nsstring
Cocoa是否提供了一种内置方法来将密钥字符串转换为格式正确的set属性访问器?即"lineSpacing" -> setLineSpacing:
例如:
NSString * key = @"lineSpacing";
SEL selector = [key magicallyConvertIntoSetPropertyAccessor];
Run Code Online (Sandbox Code Playgroud)
甚至:
NSString * key = @"lineSpacing";
SEL selector = NSSelectorFromString([key toSetPropertyAccessor]);
Run Code Online (Sandbox Code Playgroud)
背景:
我正在研究一种方法,该方法将使用存储在字典中的属性值按名称设置许多属性.我无法使用,setObject:forKey因为我也将此方法用于内置类型的属性,如NSInteger和CGFloat.以下是我用于CGFloat的方法示例,用于说明:
- (void)setFloatProperty:(NSString *)key value:(CGFloat)value target:(id)object
{
NSString * setPropertyString = [NSString stringWithFormat:@"set%@",
[key capitalizedString]];
SEL selector = NSSelectorFromString(setPropertyString);
NSMethodSignature * signature = ...
NSInvocation * invocation = ...
CGFloat arg = value;
void * argument = &arg;
[invocation setArgument:argument atIndex:2];
[invocation invoke];
}
Run Code Online (Sandbox Code Playgroud)
此方法适用于"color"或"width"等单字属性,但在"lineSpacing"或"meaningOfLifeTheUniverseAndEverything"等多字属性上失败,因为该capitalize方法将所有后续字母设置为小写时将第一个字母大写.使用"lineSpacing"作为键调用上述方法会导致失败,因为正确的属性设置器将是setLineSpacing:和不是setLinespacing:
你正在寻找setValue:forKey:,它不仅找到正确的setter选择器,而且为你发送消息.它是键值编码协议的一部分; 请注意,出于这个原因,类似于getter myProperty和类似setMyProperty:的setter 被称为"Key-Value-Coding-compliant".
我正在研究一种方法,该方法将使用存储在字典中的属性值按名称设置许多属性.
另请参阅该setValuesForKeysWithDictionary:方法,也是KVC协议的一部分.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |