Ios NSManagedObject子类的SectionNameKeyPath类别方法能否接受参数?
我正在实现这篇SO帖子:特别是Martin R的第一个建议,即添加一个category方法来为我的Ios NSManagedObject子类的SectionNameKeyPath类别方法能否接受参数?,ios,objective-c,core-data,nsfetchedresultscontroller,Ios,Objective C,Core Data,Nsfetchedresultscontroller,我正在实现这篇SO帖子:特别是Martin R的第一个建议,即添加一个category方法来为我的sectionNameKeyPath提供信息 在这里,它们有一个名为acctPeriod的持久属性用于排序描述符,还有一个名为periodYear的类别方法用于acctPeriod(准确地说,提取其前4个字符)。但是,我有许多持久性属性,如acctPeriod,用户可以选择其中任何一个作为排序描述符,我希望在它们上实现与sectionNameKeyPath相同的方法。换句话说,我想将acctPeri
sectionNameKeyPath
提供信息
在这里,它们有一个名为acctPeriod的持久属性用于排序描述符,还有一个名为periodYear的类别方法用于acctPeriod(准确地说,提取其前4个字符)。但是,我有许多持久性属性,如acctPeriod,用户可以选择其中任何一个作为排序描述符,我希望在它们上实现与sectionNameKeyPath
相同的方法。换句话说,我想将acctPeriod作为参数传递给category方法,比如periodYear:(NSString
*)acctPeriod
这可能吗?这样一个分类方法和FRC(sectionNameKeyPath
)的代码看起来如何
谢谢 正如所指出的,这应该是微不足道的:
@interface Transaction (AdditionalMethods)
-(NSString*)sectionStringForPeriod:(NSNumber*)acctPeriod;
@end
“节名键路径”是应用于每个托管对象的键路径
并返回节名,即
获取的结果控制器调用
[object valueForKeyPath:]
在分割表格时针对每个对象
分成几个部分
如果密钥路径作为(类别)方法实现,则必须
一种没有参数的方法,只使用隐式参数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使用的category方法。(我已经编辑了我的问题标题以便更清楚。)谢谢,我会试试的。另外,我不知道点语法也适用于方法(不仅仅适用于属性)。在链接的示例中(我没有足够的rep进行注释),是否不需要将访问持久性属性的行夹在willAccessValueForKey:@“acctPeriod”和didAccessValueForKey:@“acctPeriod”之间?还是只有当我们为建模属性编写自定义getter/setter时才需要它?@JSreedhar:在链接的示例中,sectionNameKeyPath
只是一个访问self.acttperiod
-如果将节名键路径实现为瞬态属性(如答案末尾所建议的),则需要will/didAccessValueForKey和原语访问器来避免无限递归。有关示例,请参见。transient属性的优点是为每个对象缓存节名,而不是频繁地重新计算。谢谢。另一件事,您是否同意Dan Shelly的建议,不要使用瞬态属性作为sectionNameKeyPath-他说这将导致故障触发。但是,如果Apple的示例代码使用它,我想它是可以的。@JSreedhar:我没有对此进行调查,因此无法对其进行评论。我调用此方法来指定NSFetchedResultsController中的sectionNameKeyPath:,我希望它的参数是当前用于排序表视图的持久属性@马丁纳说,不幸的是,这是不可能做到的。
sectionNameKeyPath:[NSString stringWithFormat:@"%@.firstFourCharacters", yourAttribute]