我有一个非常奇怪的问题,但如果我能解释得好,我想答案不会那么困难。 这是我目前的情况:
我有一个包含六个固定部分的tableView。
这些部分填充了核心数据对象。
我使用transient属性来决定必须显示对象的哪个部分。此过程在NSManagedObject子类中完成。 transient属性称为sectionIdentifier
。
由于使用transient属性决定每个对象应出现在哪个部分的原因,我决定在每个部分上创建一个特殊行,目的是每个部分总是至少有一行。此选项将减少问题,使得在添加或删除行时会抛出异常的nil部分,至少在测试应用程序时这是一个问题。
这意味着在第一次发布时,每个部分都有一行(我将其称为特殊行)。然后用户可以完美地添加/删除行。
我现在遇到的问题是,如果该部分有新行,我需要删除此特殊行。同时,如果用户删除该部分中的最后一行,该应用程序会自动创建一个新的特殊行,因此该部分永远不会为空。
我知道这不是管理它的最佳方式,但由于我的iOS知识,这是我在空白部分添加或删除行时避免异常的最佳方法。
当用户向该部分添加至少一个新行时,我需要删除部分中的特殊行。
该对象具有一个名为quitar
的字符串属性,对于特殊行:quitar = @"si"
。这样,所有特殊行都很容易识别。
如果部分中有新行,我使用此代码删除特殊行:
NSManagedObjectContext *context = self.managedObjectContext;
NSEntityDescription *entity=[NSEntityDescription entityForName:@"ToDoItem" inManagedObjectContext:context];
NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
[fetch setEntity:entity];
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"quitar like 'si'"];
[fetch setPredicate:predicate];
NSError *fetchError;
NSArray *fetchedData=[self.managedObjectContext executeFetchRequest:fetch error:&fetchError];
for (NSManagedObject *item in fetchedData){
[context deleteObject:item];
}
有人告诉我你不能在NSPredicate
中使用瞬态属性,你可以在我的代码中看到所有特殊行都被删除,而不仅仅是所需部分的特殊行。
我需要你的帮助才能找到一种方法来删除我想要的部分中的特殊行,而不是从所有部分中删除。
谢谢你,对不起我的英语。
EDITED
请在下面找到我在NSManagedObject
班ToDoItem
中指定sectionIdentifier的方式:
-(NSString *)sectionIdentifier{
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"];
[self didAccessValueForKey:@"sectionIdentifier"];
if (!tmp){
NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);
NSDate *today = [NSDate date];
NSDate *date = self.todoDueDate;
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setCalendar:calendar];
[components setYear:2065];
[components setMonth:11];
[components setDay:12];
NSDate *dateFuturoSomeday = [calendar dateFromComponents:components];
NSCalendar *calendar1 = [NSCalendar currentCalendar];
NSDateComponents *components1 = [[NSDateComponents alloc] init];
[components1 setCalendar:calendar1];
[components1 setYear:2065];
[components1 setMonth:11];
[components1 setDay:13];
NSDate *dateFuturoCompleted = [calendar1 dateFromComponents:components1];
NSDateComponents *date1Components = [calendar components:comps
fromDate: today];
NSDateComponents *date2Components = [calendar components:comps
fromDate: date];
NSDateComponents *date3Components = [calendar components:comps
fromDate: dateFuturoSomeday];
NSDateComponents *date4Components = [calendar components:comps
fromDate: dateFuturoCompleted];
today = [calendar dateFromComponents:date1Components];
date = [calendar dateFromComponents:date2Components];
dateFuturoSomeday = [calendar dateFromComponents:date3Components];
dateFuturoCompleted = [calendar dateFromComponents:date4Components];
NSInteger daysAfterToday = [calendar components:NSDayCalendarUnit
fromDate:today toDate:date options:0].day;
// NSString *section;
if (daysAfterToday < 0) {
tmp = @"0";
} else if (daysAfterToday == 0) {
tmp = @"1";
} else if (daysAfterToday > 0 && daysAfterToday < 2) {
tmp = @"2";
}
else if ([self.todoDueDate isEqualToDate:dateFuturoSomeday]){
tmp = @"4";
}
else if ([self.todoDueDate isEqualToDate:dateFuturoCompleted]){
tmp = @"5";
}
else {
tmp = @"3";
}
[self setPrimitiveValue:tmp forKey:@"sectionIdentifier"];
}
return tmp;
}
答案 0 :(得分:0)
我已经检查过cellForRowAtIndexPath
方法,我能够检测到瞬态属性sectionIdentifier
中的值。这意味着我可以使用它来识别特殊的行项,更新另一个属性的值并删除它。
ToDoItem *todoitem = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSString *sec = todoitem.sectionIdentifier;
NSString *quitar = todoitem.quitar;
if ([sec isEqualToString:@"1"] && [quitar isEqualToString:@"si" ] && ( numObjectsSec1 > 1 ) ){
NSLog(@"DAS OBJEKT KANN GELÖSCHT WERDEN %@", todoitem.todoName);
NSManagedObjectContext *context = self.managedObjectContext;
[todoitem setValue:@"si se puede borrar" forKey:@"borrar" ];
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
[context deleteObject: todoitem];
};