问题描述
我试图将我的tableview分成每个月的部分。我开始使用苹果的示例。首先,我在我的核心数据库中添加了一个属性sectionIdentifier。然后在我的managedobject子类中,我添加了这个方法。
- (NSString *)sectionIdentifier {
/ /根据需要创建和缓存段标识符。
[self willAccessValueForKey:@sectionIdentifier];
NSString * tmp = [self primitiveSectionIdentifier];
[self didAccessValueForKey:@sectionIdentifier];
if(!tmp){
/ *
节按月和年组织。创建段标识符作为表示数字的字符串(年* 1000)+月;这样,他们将按照时间顺序正确地排序,而不管月份的实际名称。
* /
NSCalendar * calendar = [NSCalendar currentCalendar];
NSDateComponents * components = [日历组件:(NSYearCalendarUnit | NSMonthCalendarUnit)fromDate:[self date]];
tmp = [NSString stringWithFormat:@%d,([components year] * 1000)+ [components month]];
[self setPrimitiveSectionIdentifier:tmp];
}
NSLog(@tmp:%@,tmp);
return tmp;
}
这是我在我的titleForHeaderSection
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id< NSFetchedResultsSectionInfo> theSection = [[self.fetchedResultsController sections] objectAtIndex:section];
/ *
节信息来自事件的sectionIdentifier,它是一个表示数字(年* 1000)+月的字符串。
要显示节标题,请将年份和月份组件转换为字符串表示形式。
* /
static NSArray * monthSymbols = nil;
if(!monthSymbols){
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setCalendar:[NSCalendar currentCalendar]];
monthSymbols = [formatter monthSymbols];
}
NSInteger numericSection = [[TheSection name] integerValue];
NSInteger year = numericSection / 1000;
NSInteger month = numericSection - (year * 1000);
NSString * titleString = [NSString stringWithFormat:@%@%d,[monthSymbols objectAtIndex:month-1],year];
NSLog(@titelstring is:%@,titleString);
return titleString;
}
对于我的行数InSection我这样做。
id< NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
NSInteger count = [sectionInfo numberOfObjects];
return count;
这是我的NumberOfSectionsInTableview
NSInteger count = [[self.fetchedResultsController sections] count];
return count;
有人可以帮忙吗?
提前!
发生了什么问题
打印我的日志NSLog(@tmp:%@,tmp);
并且我得到以下错误:
CoreData:error:(NSFetchedResultsController)名称键路径'sectionIdentifier'。对象将被放置在未命名的部分
2012-10-10 10:41:17.475 RacingGenk [15785:c07] ***由于未捕获异常NSRangeException终止应用程序,原因:' - [__ NSCFArray objectAtIndex:]:索引(-1(或可能更大))超出范围(12)'
一个常见的错误通常编码nsmanagedobject的瞬态属性,是人们忘记了在数据模型文件(xcdatamodeld)中启用瞬态属性。
I am trying to split my tableview into sections for each month. I start working with the DateSectionTitles example of apple. First of all I added in my core database a attribute 'sectionIdentifier'. Then in my managedobject subclass I added this method.
- (NSString *)sectionIdentifier {
// Create and cache the section identifier on demand.
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveSectionIdentifier];
[self didAccessValueForKey:@"sectionIdentifier"];
if (!tmp) {
/*
Sections are organized by month and year. Create the section identifier as a string representing the number (year * 1000) + month; this way they will be correctly ordered chronologically regardless of the actual name of the month.
*/
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[self date]];
tmp = [NSString stringWithFormat:@"%d", ([components year] * 1000) + [components month]];
[self setPrimitiveSectionIdentifier:tmp];
}
NSLog(@"tmp: %@",tmp);
return tmp;
}
This is what i do in my titleForHeaderSection
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> theSection = [[self.fetchedResultsController sections] objectAtIndex:section];
/*
Section information derives from an event's sectionIdentifier, which is a string representing the number (year * 1000) + month.
To display the section title, convert the year and month components to a string representation.
*/
static NSArray *monthSymbols = nil;
if (!monthSymbols) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setCalendar:[NSCalendar currentCalendar]];
monthSymbols = [formatter monthSymbols];
}
NSInteger numericSection = [[theSection name] integerValue];
NSInteger year = numericSection / 1000;
NSInteger month = numericSection - (year * 1000);
NSString *titleString = [NSString stringWithFormat:@"%@ %d", [monthSymbols objectAtIndex:month-1], year];
NSLog(@"titelstring is: %@",titleString);
return titleString;
}
For my number of rowsInSection I do this.
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
NSInteger count = [sectionInfo numberOfObjects];
return count;
And this for my NumberOfSectionsInTableview
NSInteger count = [[self.fetchedResultsController sections] count];
return count;
Can anybody help?
Thanks in advance!
What is going wrong
First off all it don't prints my log in NSLog(@"tmp: %@",tmp);And also I get the following error:
CoreData: error: (NSFetchedResultsController) A section returned nil value for section name key path 'sectionIdentifier'. Objects will be placed in unnamed section
2012-10-10 10:41:17.475 RacingGenk[15785:c07] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (12)'
One common mistake usually coding transient property for nsmanagedobject, is people forget to also "enable" transient property in the data model file (xcdatamodeld).
这篇关于使用fetchedresultcontroller为每个月设置不同的部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!