NSManagedObject子类的SectionNameKeyPath类别方法可以采用参数吗?

时间:2014-01-07 07:11:43

标签: ios objective-c core-data nsfetchedresultscontroller

我正在实施此SO帖子Custom Core Data SectionNameKeyPath:特别是,Martin R首次建议添加类别方法来提供sectionNameKeyPath

在那里,他们有一个名为acctPeriod的持久属性用于排序描述符,还有一个名为periodYear的类别方法,用于acctPeriod(准确地说,提取前4个字符)。但是,我有很多持久性属性,比如acctPeriod,用户可以为排序描述符选择任何一个属性,我想在它们上实现相同的方法,以sectionNameKeyPath的形式提供。换句话说,我想将acctPeriod作为参数传递给类别方法,例如periodYear:(NSString *)acctPeriod

这可能吗?这种类别方法和FRC(sectionNameKeyPath)的代码看起来如何?

谢谢!

2 个答案:

答案 0 :(得分:3)

“部分名称密钥路径”是应用于每个管理对象的密钥路径 并返回节名称,即 获取结果控制器调用 分割表时每个对象[object valueForKeyPath:<sectionNameKeyPath>] 分段。

如果密钥路径是作为(类别)方法实现的,则必须如此 方法不带参数,仅使用隐式参数self。 因此,我没有看到附加参数如何 在该方法中使用(除非您使用一些全局变量)。

但是,如果为所有人创建部分名称的方法完全相同 可能的属性(比如在链接示例中获取字符串的前四个字符),您可以将该方法实现为NSString上的类别:

@interface NSString (MyAdditions)
- (NSString *)firstFourCharacters;
@end

@implementation NSString (MyAdditions)
- (NSString *) firstFourCharacters {
    if ([self length] <= 4)
        return self;
    return [self substringToIndex:4];
}
@end

然后使用

动态创建表单<yourAttribute>.firstFourCharacters的部分名称密钥路径
sectionNameKeyPath:[NSString stringWithFormat:@"%@.firstFourCharacters", yourAttribute]

在获取的结果控制器中,yourAttribute是持久属性 目前用于对表视图进行排序。

键值编码机制将会 (对于每个托管对象)首先将<yourAttribute>应用于对象,然后将firstFourCharacters应用于结果。

答案 1 :(得分:0)

正如所指出的,这应该是微不足道的:

@interface Transaction (AdditionalMethods)
-(NSString*)sectionStringForPeriod:(NSNumber*)acctPeriod;
@end