在我的应用中,我有UITableView with
个部分。每个实体对象都基于名为“sectionIdentifier”的瞬态属性进行排序,该属性在名为ToDoItem.m的NSManagedObject
子类中定义。
启动应用程序后,所有对象都会正确排序并显示在预期的部分下。
在表视图控制器上有添加按钮以添加新对象,在点击它之后,应用程序抛出以下警告:
2014-01-15 11:19:19.459 To-Do Pro Light[21914:a0b] date= (null)
2014-01-15 11:19:19.461 To-Do Pro Light[21914:a0b] todayDate = 2014-01-15 18:19:19 +0000
2014-01-15 11:19:19.473 To-Do Pro Light[21914:a0b] *** -[__NSCFCalendar components:fromDate:]: date cannot be nil
我的意思是,你觉得这个操作应该用零日期来表示什么? 目前已经避免了例外。 这个投诉会报告其中一些错误,然后进一步的违规行为只会默默地做任何随机的事情。 这是此次发生的回溯(由于编译器优化,某些帧可能会丢失):
(
0 CoreFoundation 0x01ab8475 -[__NSCFCalendar components:fromDate:] + 101
1 CoreFoundation 0x01b5496c -[_NSCopyOnWriteCalendarWrapper components:fromDate:] + 92
2 To-Do Pro Light 0x00008e95 -[ToDoItem sectionIdentifier] + 357
3 Foundation 0x0145b947 _NSGetUsingKeyValueGetter + 119
4 CoreData 0x0029d75a _PF_Handler_Public_GetProperty + 122
5 CoreData 0x0029d685 -[NSManagedObject valueForKey:] + 149
6 Foundation 0x0147aa5a -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 409
7 CoreData 0x003696ed -[NSFetchedResultsController(PrivateMethods) _objectInResults:] + 77
8 CoreData 0x00369995 -[NSFetchedResultsController(PrivateMethods) _preprocessInsertedObjects:insertsInfo:newSectionNames:] + 389
9 CoreData 0x0036c1bd -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 1197
10 Foundation 0x01500bf9 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40
11 CoreFoundation 0x01b06524 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
12 CoreFoundation 0x01a5e00b _CFXNotificationPost + 2859
13 Foundation 0x0143a951 -[NSNotificationCenter postNotificationName:object:userInfo:] + 98
14 CoreData 0x00271173 -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 83
15 CoreData 0x0031078f -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] + 367
16 CoreData 0x0026c608 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2152
17 CoreData 0x0026bd99 -[NSManagedObjectContext processPendingChanges] + 41
18 CoreData 0x0023ffe1 _performRunLoopAction + 321
19 CoreFoundation 0x01a724ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
20 CoreFoundation 0x01a7241f __CFRunLoopDoObservers + 399
21 CoreFoundation 0x01a50344 __CFRunLoopRun + 1076
22 CoreFoundation 0x01a4fac3 CFRunLoopRunSpecific + 467
23 CoreFoundation 0x01a4f8db CFRunLoopRunInMode + 123
24 GraphicsServices 0x038bb9e2 GSEventRunModal + 192
25 GraphicsServices 0x038bb809 GSEventRun + 104
26 UIKit 0x0059bd3b UIApplicationMain + 1225
27 To-Do Pro Light 0x000078ad main + 141
28 libdyld.dylib 0x020e6725 start + 0
)
2014-01-15 11:19:19.478 To-Do Pro Light[21914:a0b] Tmp= 0
2014-01-15 11:19:19.524 To-Do Pro Light[21914:a0b] Fecha del todo = 2014-01-15 18:19:19 +0000
我无法理解,但在唯一的文件中,日历组件位于ToDoItem.m NSManagedObject
类中,我向您展示:
#import "ToDoItem.h"
#import "ToDoGroup.h"
#import "ToDoSubItem.h"
@implementation ToDoItem
@dynamic todoDescription;
@dynamic todoName;
@dynamic todoDueDate;
@dynamic sectionIdentifier;
@dynamic todogroup;
@dynamic todosubitems;
-(NSString *)sectionIdentifier{
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"];
[self didAccessValueForKey:@"sectionIdentifier"];
if (!tmp){
NSDate *date = self.todoDueDate;
NSDate *todayDate = [NSDate date];
NSLog(@"date= %@",date);
NSLog(@"todayDate = %@",todayDate);
NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);
NSDateComponents *date1Components = [calendar components:comps fromDate:date];
NSDateComponents *date2Components = [calendar components:comps fromDate:todayDate];
date = [calendar dateFromComponents:date1Components];
todayDate = [calendar dateFromComponents:date2Components];
if([date
compare:todayDate] == NSOrderedSame) {
tmp = @"1";//TODAY
}
else if([date
compare:todayDate] == NSOrderedDescending){
tmp = @"2";//OVERDUE
}
else if ([date
compare:todayDate] == NSOrderedAscending){
tmp =@"0";//UPCOMING
}
NSLog(@"Tmp= %@",tmp);
[self setPrimitiveValue:tmp forKey:@"sectionIdentifier"];
}
return tmp;
}
@end
欢迎任何帮助,如果你想让我向你展示我的tableView控制器,没问题..... 提前谢谢。
答案 0 :(得分:1)
这意味着
NSDate *date = self.todoDueDate;
返回nil
,即您没有为新创建的对象设置todoDueDate
。
您无法从nil
日期计算日期组件。