0

這是我用來創建一個新對象的代碼。問題是,如果我選擇不保存新對象,它會創建一個空的tableview單元格。我怎樣才能防止這種情況發生?防止核心數據創建空對象

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Add"]) { 
     NSLog(@"Setting PersonsTVC as a delegate of PersonDetailTVC"); 
     StepDetailView *personDetailTVC = segue.destinationViewController; 
     personDetailTVC.delegate = self; 
     personDetailTVC.title = @"Add New Step"; 
     NSLog(@"Creating a new person and passing it to PersonDetailTVC"); 
     Step *newPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Step" 
                 inManagedObjectContext:self.managedObjectContext]; 

     personDetailTVC.person = newPerson; 
    } 
    else { 
     NSLog(@"Unidentified Segue Attempted!"); 
    } 
} 

什麼我試過到目前爲止被插入下面personDetailTVC.person = newPerson;

if (newPerson.name == nil) { 
    [self.managedObjectContext deleteObject:newPerson]; 
    [self.managedObjectContext save:nil]; 

    [self performFetch]; 
    [self.tableView reloadData]; 
} 

後的代碼,但它不是一個很好的解決方案,因爲它崩潰的應用程序,因爲實現代碼如下細胞沒有得到刪除,只有對象沒有。 我認爲我可以做的是自動刪除第一個tableview單元格,如果該對象爲null,但我還沒有找到辦法。

有什麼建議嗎?

+1

對不起,你能解釋一下更好的目標嗎?我不明白你在這裏問什麼..謝謝 –

+0

你應該保存它。如果不需要,您可以稍後刪除它。 – Shmidt

回答

0

我正在猜測我在想什麼。如果他們錯了,請糾正我的任何假設。

  • 你有一個UITableView
  • 細胞與來自CoreData數據填充。
  • 而你正在通過NSFetchedResultsController填充它
  • segue是一個PersonDetailVC,它允許用戶輸入新的managedobject的數據?

發生了什麼事情是當你'insertNewObjectForEntity:'一個新的空白託管對象被創建並插入到核心數據。 NSFetchedResultsController得到更改通知,並且新的單元格被插入UITableView。 NSFetchedResultsController獲取更改,並添加一個空白單元格。

無論您是否保存上下文,它都已存在於核心數據存儲中。 「保存」只是確保更改反映在覈心數據的持久性存儲(sqlite或plist)中。核心數據存在於內存中,sqlite持久性存儲僅用於持久性。

解決方案是在用戶輸入數據之前不插入核心數據。你不應該在segue中做一個核心數據插入。

解決方案: - Segue to PersonDetailVC沒有創建新對象。 - 用戶完成輸入數據後,用戶按「保存」或「完成」 - 從PersonDetailVC彈出時,使用填充的字段將新的managedObject插入到Core Data中。 - NSFetchedResultsController將選擇修改並適當地修改UITableView。

注意:如果您使用NSFetchedResultsController,則不需要[self.tableview reloadData]。 fetchedresultscontroller在合併所有更改後調用它。