Я реализую любимый сценарий, используя в своем приложении, используя MagicalRecord the CoreData Wrapper. Я ищу значение, которое, если атрибут найден в моей сущности, удалит его как fav, иначе он добавит его в fav. Здесь DX *foundDX = [DX MR_findFirstByAttribute:@"code" withValue:cell.DXCodeName.text];
foundDX - это значение, которое я проверяю.
У меня есть UISearchBar, добавленный в мой tableView. Поэтому, когда представление загружено, он отображает уже избранные элементы, которые используют un-fav. Если пользователь ищет и выбирает элемент, он успешно добавляет его в fav и успешно удаляет его из модели данных. Но если я снова нажму на кнопку fav, он сработает.Удаленный объект снова найден findFirstByAttribute в MagicalRecord
if (!foundDX.code) {
//If we are always getting into here that means that either foundDX is nil
//or the code is nil so you need to verify the logic around that.
if (indexPath != nil)
{
if (!_AddEditDX) {
self.AddEditDX = [DX MR_createEntity];
}
[self.AddEditDX setCode:cell.DXCodeName.text];
[self.AddEditDX setDescriptions:cell.DXDescText.text];
[self.AddEditDX setIsFav:[NSNumber numberWithInt:1]];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
[self.favDXArray addObject:self.AddEditDX];
[self fetchFavDX];
[cell.DXFavButton setImage:[UIImage imageNamed:@"star_filled"] forState:UIControlStateNormal];
[KSToastView ks_showToast:@"Added to Favourite" duration:1.0f];
}
} else if(self.favDXArray.count > indexPath.row) {
//You can get rid of the if(foundDX.code) because this is the else block to not having it so we must have it.
//Only thing to worry about is the array size
NSLog(@"count is: %ld and row is: %ld",_favDXArray.count, (long)indexPath.row);
DX *tempDX = [self.favDXArray objectAtIndex:indexPath.row];
[tempDX MR_deleteEntity];
[cell.DXFavButton setImage:[UIImage imageNamed:@"star_blank"] forState:UIControlStateNormal];
[self.favDXArray removeObjectAtIndex:indexPath.row];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
[KSToastView ks_showToast:@"Removed from Favourite" duration:1.0f];
}
По Применяя некоторые контрольные точки, которые я нашел, что:
Пусть код E45
и foundDX
не нашел его в первый раз, и добавить его в модель данных. Затем, снова нажав кнопку fav, он удаляет его и в действительности он удаляет его. Но если я снова нажимаю кнопку fav, то foundDX по-прежнему E45
, и поэтому он падает. Но если я закрою приложение и запустил его снова, то E45
больше не существует.
ОБНОВЛЕНИЕ
Я обновил код, указанный выше. Я использовал fetchFavDX
в viewDidLoad
, поэтому я попробовал называть его в методе, обновленном в коде выше. В то время как в fetchFavDX
я это делаю:
-(void)fetchFavDX {
self.favDXArray = [NSMutableArray arrayWithArray:[DX MR_findAllSortedBy:@"code" ascending:YES]];
}
Сейчас он работает нормально в течение первых двух раз, означающих добавить/удалить/добавить/удалить. После этого он запускает только блок if (!foundDX.code)
, что означает, что он не попадает в другую часть.
Можете ли вы обновить приведенный выше журнал сбоев? Пожалуйста, – HarmVanRisk
@HarmVanRisk это 'индекс 0 за пределами для пустого массива ', который указывает, что объект удален, что является правильным, если я снова запустил приложение. Но если это тот же самый запуск, он вылетает с этой ошибкой. –