在我的应用程序中,我有一个带有 部分的UITableView。每个实体对象都根据名为“sectionIdentifier”的 transient 属性进行排序,该属性在名为 ToDoItem.m 的
NSManagedObject
子类中定义
当应用程序启动时,所有对象都会正确排序并显示在预期部分下。
在 TableView Controller 上有一个添加按钮来添加一个新对象,点击它之后,应用程序会抛出以下警告:
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
我的意思是说真的,你认为这个操作对于 nil 日期应该意味着什么? 现在已经避免了异常。 这些错误中的一些将通过此投诉进行报告,然后进一步的违规行为将简单地默默地做任何由 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 Controller ,没问题...... 提前谢谢你。
最佳答案
也就是说
NSDate *date = self.todoDueDate;
返回nil
,即您没有为新创建的对象设置todoDueDate
。
您不能从 nil
日期计算日期组件。
关于ios - 核心数据对象未正确更新或发布定义日期组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145422/