如何更新 Core Data 上的用户界面?

How to update user interface on Core Data?

我还有一个带有 UITableView、Core Data 和 NSFetchedResultsController 的应用程序。我已将数据传递给 DetailViewController。我可以从 DetailViewController 中删除它们!在Apple的iOS Notes应用程序中,您可以看到我想要的功能!当您从 DetailViewController 中删除注释时(例如),对象将被删除,Notes 应用程序会自动显示下一个或上一个注释!我想创建这样的功能。删除当前对象后如何更新用户界面?这是我的代码!谢谢` 导入 UIKit 导入核心数据

class DetailViewController: UIViewController {

@IBOutlet weak var containerLabel: UILabel!

var retrieveData:NSManagedObject!
var managedObjectContext:NSManagedObjectContext!
var manager:Manager!

override func viewDidLoad() {
    super.viewDidLoad()
// Do any additional setup after loading the view.

    self.containerLabel.userInteractionEnabled = false
    self.containerLabel.textColor = UIColor.redColor()
    self.containerLabel.alpha = 0

    UIView.animateWithDuration(2.5) { () -> Void in
        self.containerLabel.alpha = 1
    }


    if let demo = self.retrieveData.valueForKey("titleField") as? String {
     self.containerLabel.text = demo
    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func backToMain(sender: AnyObject) {
    // Back to the MainTableViewController
    self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func trashButton(sender: AnyObject) {

    self.managedObjectContext.deleteObject(retrieveData)

    do {
    try self.managedObjectContext.save()
    } catch {

    }
    self.dismissViewControllerAnimated(true, completion: nil)


}

`

如果我在列表中有 5 个项目:

当我 select 列表中的第四项时(例如)。 detailVC 向我展示了 selected 项目,如下所示:

我想删除它们。当我删除 "Four" 然后我的 containerLabel.text 显示列表中的先前对象时。它们在 "Four" 被删除后,"Three"、"Two" 和 "One" 也被删除。 "One" 删除后我的 containerLabel.text 显示字符串

但我留下了一个名为 "Five"

的对象

我的问题是"Five"!我不能删除它。示例:在 iOS Notes 应用程序中,如果列表中有五个对象,就像我的演示应用程序一样。当您 select 列表中的第四个对象时(例如)。并开始删除它们,在 "Four" 删除后 iOS Notes App 显示 "Five"。 "Five"(列表中的最后一个对象)被删除,然后 iOS Notes App 显示 "Three"、"Two" 和 "One"。也许问题行在这里:

if index != 0 { self.retrieveData = fetchedObject[index! - 1] } else { self.retrieveData == fetchedObject[0] }

您要么需要传递详细信息视图控制器

  1. 所有托管对象的列表和列表中起始位置的索引
  2. 当前托管对象和获取下一个对象的回调

为了让它有足够的信息来做你想做的事。回调方法是最好的,是一种简单的委托形式,您的主视图控制器是提供额外数据的委托。

让我们在这里走简单(但不是那么优雅)的路线。您必须像这样将所有获取的对象传递给详细信息 VC:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

if segue.identifier == "yourSegueIdentifier"{

    if let destinationVC = segue.destinationViewController as? DetailViewController{

        destinationVC.managedObjectContext = yourContext
        destinationVC.retrieveData = yourManagedObject
        destinationVC.arrayOfFetchedObjects = yourFetchedResultsController.fetchedObjects
        //pass over other data...

        }
    }
}

然后,在您的详细信息VC中,编写一个方法,当您按下删除按钮时将执行该方法。像这样:

@IBAction func trashButton(sender: AnyObject) {

//make sure you have an array with YourObjects
guard let fetchedObjects = arrayOfFetchedObjects as? [YourObjectType] else {return}

//get index of the shown object in the array of fetched objects
let indexOfObject = fetchedObjects.indexOf(retrieveData)

//delete the object from the context
self.managedObjectContext.deleteObject(retrieveData)

do {
    try self.managedObjectContext.save()

    //delete the object from the fetchedObjects array
    fetchedObjects.removeAtIndex(indexOfObject)
} catch {

}

//get the object that should be shown after the delete
if indexOfObject != 0{
    //we want the object that represents the 'older' note
    retrieveData = fetchedObjects[indexOfObject - 1]
    updateUserInterface(true)

}
else{
    //the index was 0, so the deleted object was the oldest. The object that is the oldest after the delete now takes index 0, so just use this index. Also check for an empty array.

    if fetchedObjects.isEmpty{ 
         updateUserInterface(false)
     }
    else{
        retrieveData = fetchedObjects[0]
        updateUserInterface(true)
    }

    }
}


func updateUserInterface(note: Bool){

switch note{

    case true:

        //update the user interface
        if let demo = retrieveData.valueForKey("titleField") as? String {
            self.containerLabel.text = demo
        }

    case false:

        self.containerLabel.text = "no more notes"

    }
}