2016-10-03 61 views
0

我正在實現使用MagicalRecord和CoreData Wrapper的應用程序中的收藏場景。我正在尋找的價值,如果在我的實體中找到該屬性,它會刪除它作爲最喜歡的,否則它會將它添加到最喜歡的。在這裏做DX *foundDX = [DX MR_findFirstByAttribute:@"code" withValue:cell.DXCodeName.text]; foundDX是我正在檢查的值。
我有一個UISearchBar添加到我的tableView。所以當視圖被加載的時候,它會顯示已經使用過的最不喜歡的項目。如果用戶搜索並選擇一個項目,它會成功將它添加到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]; 
    } 

通過應用一些斷點我發現:
假設代碼是E45foundDX沒有發現它的第一次,並把它添加到數據模型。然後再次按下fav按鈕將其刪除,實際上刪除它。但如果我再次點擊收藏按鈕,foundDX仍然E45,因此它崩潰。但是,如果我關閉應用程序並再次運行它,則E45不再存在。

UPDATE
我已更新上面的代碼。我在viewDidLoad中使用fetchFavDX,所以我嘗試在上面的代碼中更新的方法中調用它。而在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]; 
} 

更新

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

現在,如果我運行該項目,它第一次運行它意味着添加>刪除>添加,那麼它似乎'[self.favDXArray addObject:self.AddEditDX];'沒有添加值。因爲在此之後計數爲零。這是因爲它正在重複我的想法。 –

相關問題