在列表表视图中选择任何行时,swift中的核心数据更新无效?

时间:2015-12-04 04:28:46

标签: swift core-data ios9

我有一个场景,其中我有两个VC -

VC1 - 输入细节&保存数据。 VC2 - 在表格视图中显示数据。

现在我希望每当我选择任何特定行时,我都会在特定行更新我的数据库。为此,我将在我使用以下代码的特定行传递选定的托管对象。

VC2班级名称 - ViewController

获取请求的代码 -

func fetchData()
{
    let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    let managedContext = appdelegate.managedObjectContext

    let fetchRequest = NSFetchRequest(entityName: "Person")

    do
    {
        people = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
        print(people)
        print("FETCHING DATA")

    }
    catch let error as NSError
    {
        print("could not fetch \(error), \(error.userInfo)")
    }

    }

传递所选行中数据的代码 -

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {
        if segue.identifier == "segueupdate"
        {

            let update = segue.destinationViewController as! EnterDetailViewController
          //  var managedobject = NSManagedObject()
            let indexpath = self.tableview.indexPathForSelectedRow

            let row = indexpath?.row
          let  managedobject = people[row!]

            update.managedobjectt = managedobject

        }
    }

VC2班级名称 - EnterDetailViewController

class EnterDetailViewController: UIViewController {

    @IBOutlet weak var nametextfield: UITextField!
    var managedobjectt = NSManagedObject()
    override func viewDidLoad() {
        super.viewDidLoad()
        if let s = managedobjectt.valueForKey("name") as? String
        {
            nametextfield.text = s //here I show the user the existing name value
        }

    }

现在我的保存功能 -

@IBAction func savedata(sender: AnyObject)
    {

    let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    let managedcontext = appdelegate.managedObjectContext

    let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedcontext)

    let person = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedcontext)
    person.setValue(self.nametextfield.text, forKey: "name")

    do
    {
        try managedcontext.save()
        print("SAVED")

    }
    catch let error as NSError
    {
        print("could not save \(error), \(error.userInfo)")
    }

    self.navigationController?.popToRootViewControllerAnimated(true)

}

这里我希望编译器检查收到的托管对象并更新我无法做的任何更改,因为SWIFT不接受托管对象类型作为条件,但我能够通过以下方式实现数据库的更新ObjC中的这个概念。

另一个问题是,当我尝试编译时,我得到一个错误 -

  

无法在NSManagedObject类上调用指定的初始值设定项   ' NSManagedObject'

prepereforsegue()方法中的

。那么如何解决问题并进行更新。

1 个答案:

答案 0 :(得分:1)

这一行是错误的,因为您正在尝试创建无效的托管对象实例:

var managedobjectt = NSManagedObject()

应该是

var managedobjectt : NSManagedObject?

当您更新时,您不会更改当前项目(如果存在),您只需要始终创建新实例。你应该

if let person = self.managedobjectt {
    // update (if anything other than below)
} else {
    // create new (insert and set any default values)
}

person.setValue(self.nametextfield.text, forKey: "name")

// save