2016-10-03 1 views
0

Я реализую любимый сценарий, используя в своем приложении, используя 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), что означает, что он не попадает в другую часть.

+0

Можете ли вы обновить приведенный выше журнал сбоев? Пожалуйста, – HarmVanRisk

+0

@HarmVanRisk это 'индекс 0 за пределами для пустого массива ', который указывает, что объект удален, что является правильным, если я снова запустил приложение. Но если это тот же самый запуск, он вылетает с этой ошибкой. –

ответ

1

Вы должны проверить, что счет self.favDXArray больше, чем indexpath.row, так что есть что-то там, чтобы действительно удалить/извлечь. Было бы что-то вроде этого:

if(self.favDXArray.count > 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]; 
    [KSToastView ks_showToast:@"Removed from Favourite" duration:1.0f]; 
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 
} 

Update

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) 
    { 
     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]; 
} 

Убедитесь, что метод получения foundDX возвращается то, что вы ожидаете. Также убедитесь, что добавление/удаление оставляет вас в состоянии, в котором вы ожидаете быть, т. Е. У вас есть добавленный или удаленный контент.

+0

Этот ответ дал мне что-то, и я чувствую, что я близок к его завершению. Вы можете увидеть обновленный вопрос и соответственно обновить свой ответ. –

+0

@TalhaCh Я обновил все, что мог, с тем, что вы представили. Надеюсь, это поможет вам – HarmVanRisk

+0

Теперь, если я запустил проект, он запускает его в первый раз, добавляя> remove> add, и кажется, что '[self.favDXArray addObject: self.AddEditDX];' не добавляет значение. Потому что после этого счетчик равен нулю. Это потому, что я повторяю это. –

Смежные вопросы