UITableView,其中Year为section,Month为item GIVEN一组带有NSDate属性的NSManagedObject

时间:2013-12-22 05:47:25

标签: ios uitableview nsfetchedresultscontroller

我正在制作'时间轴'功能。在我的核心数据中,我有一组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

2 个答案:

答案 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需要一个持久性密钥才能进行分组......所以如果你想按年份分段,你必须在你的妈妈里创建一个年份属性。