我正在制作'时间轴'功能。在我的核心数据中,我有一组NSManagedObject
(对象)。每个Object都有NSDate
属性(日期)。
不,我想要UITableView
作为时间表。每年将是一个部分,每个月将是一个项目。例如,我有三个对象。他们的日期是“2013年11月”,“2013年10月”,“2012年10月”。表格视图应该是:
--2013--
Nov
Oct
--2012--
Oct
因为我希望这个表视图与我的数据库同步,所以我想使用fetched results controller。我现在能想到的天真的方法是在我的核心数据中创建一个'Date'对象。 'Date'与'Object'有多对一的关系。每次我创建一个Object时,我都需要将它与Date对象联系起来。然后我可以通过查询这个Date对象来创建NSFetchedResultsController
。
我想知道是否有比上述更好的解决方案?我不太喜欢上面的解决方案,因为它需要在核心数据中创建一个新对象。
谢谢!
-Erben
答案 0 :(得分:0)
我建议您先从核心数据中获取所有结果,然后使用comparatorBlock或selectorFunction对数组进行排序,这样,
1)使用componentSeparator方法将字符串拆分为两个' - '。您将获得两个对象的字符串数组,一个月和明年
2)现在优先考虑年份,将其转换为整数和匹配
对数组进行排序后,现在创建并调用将特定年份的索引位置存储到数组中的函数
基于那些索引年份数组,您可以创建表。
这是我想要遵循的逻辑。我会尽快测试并上传代码。
以下最终工作代码。
NSArray *data = @[@"Nov-2013",@"Oct-2013",@"Oct-2012",@"Jan-2012",@"Feb-2012",@"Jan-2013"];
NSArray *monthArray = @[@"Jan",@"Feb",@"Mar",@"Apr",@"May",@"Jun",@"Jul",@"Aug",@"Sep",@"Oct",@"Nov",@"Dec"];
data = [data sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSArray *strArray1 = [(NSString *)obj1 componentsSeparatedByString:@"-"];
NSArray *strArray2 = [(NSString *)obj2 componentsSeparatedByString:@"-"];
NSComparisonResult result =NSOrderedSame;
NSInteger year1 = [((NSString*)strArray1[1]) integerValue];
NSInteger year2 = [((NSString*)strArray2[1]) integerValue];
if(year1>year2)
result = NSOrderedAscending;
else if (year1<year2)
result =NSOrderedDescending;
else{
NSInteger month1;
NSInteger month2;
for(month1=0;monthArray.count;month1++)
if([strArray1[0] isEqualToString:monthArray[month1]])
break;
for(month2=0;monthArray.count;month2++)
if([strArray2[0] isEqualToString:monthArray[month2]])
break;
if (month1>month2)
result=NSOrderedAscending;
else if (month1<month2)
result=NSOrderedDescending;
}
return result;
}];
NSLog(@"%@",data);
/*
(
"Nov-2013",
"Oct-2013",
"Jan-2013",
"Oct-2012",
"Feb-2012",
"Jan-2012"
)
*/
NSMutableArray *indexArray = [NSMutableArray array];
NSInteger lastIndex=0,i=0;
NSInteger lastYear =[((NSString *)[(NSString *)data[0] componentsSeparatedByString:@"-"][1]) integerValue];
for (i=1; i<data.count; i++) {
NSInteger year =[((NSString *)[(NSString *)data[i] componentsSeparatedByString:@"-"][1]) integerValue];
if(year!=lastYear){
NSDictionary *dic =@{@"year":[NSNumber numberWithInteger:lastYear],@"fromIndex":[NSNumber numberWithInteger:lastIndex],@"toIndex":[NSNumber numberWithInteger:i-1]};
[indexArray addObject:dic];
lastYear=year;
lastIndex=i;
}
}
NSDictionary *dic =@{@"year":[NSNumber numberWithInteger:lastYear],@"fromIndex":[NSNumber numberWithInteger:lastIndex],@"toIndex":[NSNumber numberWithInteger:i-1]};
[indexArray addObject:dic];
NSLog(@"%@",indexArray);
/*
(
{
fromIndex = 0;
toIndex = 2;
year = 2013;
},
{
fromIndex = 3;
toIndex = 5;
year = 2012;
}
)
*/
Use this arrayof dictionaries to feed data to table.
Hope this HELPS.
答案 1 :(得分:0)
NSFetchedResultsController需要一个持久性密钥才能进行分组......所以如果你想按年份分段,你必须在你的妈妈里创建一个年份属性。