2015-06-14 61 views
2

我最初有我的應用程序安裝程序來將一個行項目存儲在我的核心數據模型中的單個實體中。之後,我決定改變這個設置,讓主uitableview只列出每個項目的名稱,然後當你點擊一個項目時,你可以編輯項目名稱並在uitextview中添加額外的子項目。使用兩個獨立的視圖控制器更新核心數據模型

我有兩個VC。

  • 的ViewController
  • EditItem

我現在有兩個實體。

項目 - > ITEMNAME
列表 - > LISTNAME

ItemList
*列表的關係 - 列表 - 項目

ListItem
*項目的關係 - 項目 - 列表

我有點困惑的是如何去獲取數據t正被存儲在新實體中。如果ListItem的孩子,將從List自動獲取對象Item

現在您可以在主VC上輸入一個項目並保存它。如果您然後點擊該項目,您將被帶到一個輔助VC,讓您編輯該項目。

當我在我的主VC中獲取Item時,我是否也應該從List獲取對象,然後在我的prepareforsegue方法內傳遞它們?

這裏的想法是:

  • 如果該項目名稱存在,它被單獨留在家中或編輯,應該寫回模型
  • 如果沒有todolist的,用戶應加項目添加到列表中,並且點擊Save應當在此時更新itemtodo list

當前NSFetchedResultsController上的ViewController

-(NSFetchedResultsController *) fetchedResultsController { 
if (_fetchedResultsController != nil) { 
    return _fetchedResultsController; 
} 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init]; 
NSManagedObjectContext *context = [self managedObjectContext]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"itemname" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil]; 
fetchRequest.sortDescriptors = sortDescriptors; 
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 
_fetchedResultsController.delegate = self; 
return _fetchedResultsController; 
} 

當前保存IBAction爲上EditItem

- (IBAction)save:(id)sender { 
NSManagedObjectContext *context = [self managedObjectContext]; 

if (self.editItemField) { 
    // Update existing device 
    self.toDoItem.itemname = self.editItemField.text; 
} 

NSError *error = nil; 
// Save the object to persistent store 
if (![context save:&error]) { 
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
} 

[self.navigationController popViewControllerAnimated:YES]; 
} 

編輯

Edit Item VC Data Model

正如您從屏幕截圖中可以看到的,想法是頂部文本字段使用上一個VC的列表標題填充。這工作就像它應該。用戶可以編輯標題或保持原樣。然後他們可以使用第二個文本框將項目添加到該列表。

當我在Edit Item VC上提交列表項時,新對象保存到我的模型中,但不顯示在UITableView中。從我認爲這應該起作用的方式來看,我認爲我的Edit Item VC應該與我的ViewController VC安裝非常相似。我不應該得到任何東西,因爲在我設置我的上下文時最初是處理的,等等。因爲我的Item實體和我的List實體之間存在關係,所有這些信息一起被提取。我在這個假設中糾正了嗎?

當我將一個項目保存到Edit Item VC上的模型中時,是否在列表項目與其父項目名稱之間自動生成關聯?

任何在這方面正確的方向推動是讚賞。

編輯

我說:

NSError *error = nil; 
if (![[self fetchedResultsController] performFetch:&error]) { 
    NSLog(@"Error: %@", error); 
    abort(); 
} 

進入我的viewDidLoad方法。這導致數據實際上在EditItem VC的UITableView中填充,但是,無論我在主VC中點擊哪個項目,我都會得到相同的列表。

例子:

  • 我創建Item 1
  • 我敲擊Item 1然後在EditItem VC創建兩個項目
  • 我回到初始VC
  • 我創建Item 2
  • I磁帶上Item 2
  • Item 1顯示爲Item 2

回答

1

我解決了這個問題。

這是做了什麼。

首先是對文件,排列等進行了嚴格的清理。有些對象,屬性等沒有意義。重命名的事情幫了很多忙,因爲我引起了很多混亂。

我的列表和我的項目實體之間存在一對一的關係。這已更新爲使其成爲一對多關係。一個清單,並有許多項目。使用謂詞來抓取我需要的數據是真正解決問題的關鍵。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list == %@", self.toDoList]; 
     [fetchRequest setPredicate:predicate];  

現在,事情的工作方式,他們應該。主VC擁有許多列表名稱。第二個VC只顯示與該特定列表有關的項目。

相關問題