【发布时间】:2016-03-04 06:48:14
【问题描述】:
我有一个基于表格视图的应用程序,它有一个 MasterTableViewController 和一个 DetailChildTableViewController。
MasterTableViewController 在导航栏中有一个 +,因此用户可以看到在文本字段中输入该文件夹的名称。用户完成后,时钟完成,然后使用 Core Data 存储此文件夹,并在 MasterTableViewController 中显示此新文件夹。
这里是这个特定 TableViewController 的代码
MasterTableViewController
class MasterTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var fetchedResultsController : NSFetchedResultsController = NSFetchedResultsController()
// Populate fetched results controller
func getFetchedResultController() -> NSFetchedResultsController {
fetchedResultsController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
return fetchedResultsController
}
func taskFetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Folder")
let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
}
override viewDidLoad(){
fetchedResultsController = getFetchedResultController()
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch _ {
}
}
// Table View Methods to show data in Custom UITableViewCell and Segue method....
此控制器中的其余代码仅具有在表格视图单元格中显示数据的方法和一个 segue 方法,当用户点击新创建的单元格对象时,该方法将核心数据名称传递给下一个视图控制器。
这是创建此特定对象以保存并显示在 MasterTableViewController 上的代码
AddViewController
class addItemTableViewController: UITableViewController {
@IBOutlet weak var FolderName: UITextField!
// Use the same managed object to save
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
@IBAction func Done(sender: AnyObject){
// Calling a function to save the folder to core data
saveFolder()
self.dismissViewControllerAnimated(true, completion: nil)
}
// Function that saves
func saveFolder(){
let entityDescription = NSEntityDescription.entityForName("Folder", inManagedObjectContext: managedObjectContext)
let item = Folder(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext)
item.name = FolderName.text!
// Passed Value of the color picker table view below
do {
try managedObjectContext.save()
print("Successfully Saved \n")
} catch _ {
}
}
}
所以这段代码基本上保存了新输入的文件夹并关闭了文件夹名称视图,MasterTableViewController 显示了这个新文件夹。
问题在于 DetailChildTableViewController,它是 MasterTableViewController 中创建的每个 Folder 的详细信息。
这是最终tableview Controller的代码
** DetailChildTableViewController**
class DetailChildTableViewController: UITableViewController, UIPopoverPresentationControllerDelegate, NSFetchedResultsControllerDelegate {
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var fetchedResultsController : NSFetchedResultsController = NSFetchedResultsController()
// Populate fetched results controller
func getFetchedResultController() -> NSFetchedResultsController {
fetchedResultsController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
return fetchedResultsController
}
func taskFetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "List")
let sortDescriptor = NSSortDescriptor(key: "itemListName", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
override func viewDidLoad() {
super.viewDidLoad(){
// Core data
fetchedResultsController = getFetchedResultController()
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch _ {
}
self.tableView.reloadData()
}
// MARK: - Display the results in table view
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
if let sections = fetchedResultsController.sections {
return sections.count
}
return 0
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let sections = fetchedResultsController.sections {
let currentSection = sections[section]
return currentSection.numberOfObjects
}
return 0
}
}
此 DetailChildTableViewController 在导航栏中也有一个 + 按钮,并会弹出一个类似的 AddViewController 以使用相同的 Core Data 方法将数据添加到此特定文件夹。
问题是当我在我的 MasterTableViewController 中创建 2 个实体时,例如:
- Folder_One
- Folder_Two
我进入 Folder_Two 并在此文件夹中创建一个列表对象,然后返回 MasterTableViewController 然后选择 Folder_One,它仍然显示相同的列表对象我在 Folder_Two 中创建。
我该如何解决这个简单但不清楚的问题?
顺便说一下,这是我的数据模型:
TestApp.xcdatamodel
实体:
- 文件夹
-
列表
属性: name 类型为 String(用于 Folder 实体) itemListName 类型为 String(用于 List 实体)
关系:(对于文件夹实体) 关系目的地:列表
请注意,列表实体未列为与文件夹有关系。我将 Folder 设置为与 List 的关系为 一对多 关系。
我做错了什么,我该如何处理?
【问题讨论】:
标签: ios entity-framework sqlite core-data swift2