核心数据更新swift当选择列表中的任何行视图不工作? [英] Core Data Update in swift while selecting any row in list table view not working?

查看:116
本文介绍了核心数据更新swift当选择列表中的任何行视图不工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个场景,我有两个VC,它们是 -



VC1 - 输入detail&保存数据。
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让错误为NSError
{
print (无法获取\(错误),\(error.userInfo))
}

}

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

  override func prepareForSegue segue:UIStoryboardSegue,sender:AnyObject?)
{
如果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()
如果let s = managedobjectt.valueForKey(name)as? String
{
nametextfield.text = s //这里我向用户显示现有的名称值
}

}



现在在我的保存函数中,我执行 -

  @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让错误为NSError
{
print(无法保存\错误),\(error.userInfo))
}

self.navigationController?.popToRootViewControllerAnimated(true)

}

这里我希望编译器检查接收的托管对象,并更新数据库的任何更改,我不能做,因为SWIFT不' t接受一个managedobject类型作为条件,但我能够实现更新的数据库这个概念在ObjC。



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




无法呼叫NSManagedObject类别上的指定初始化程式类别
'NSManagedObject'


prepereforsegue()方法中的

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

解决方案

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

  var managedobjectt = NSManagedObject()

应该是

  var managedobjectt:NSManagedObject? 

当您更新时,如果当前项目不存在,创建一个新实例。你应该

 如果let person = self.managedobjectt {
//更新$ b} else {
//创建新的(插入并设置任何默认值)
}

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

// save


I have got a scenario in which I have 2 VC which are -

VC1 - To enter detail & save the data. VC2 - To display the datas in a table view.

Now I want that whenever I select any particular row I would update my Database at the particular row. For that I am passing the selected managed object at that particular row for which I use the following code.

VC2 class name - ViewController

Code to fetch request -

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)")
    }

    }

Code to pass the data in selected row -

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 class name - 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
        }

    }

Now in my save function I do -

@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)

}

Here I want the compiler to check the received managed object and update any changes to the database which I am unable to do because SWIFT doesn't accept a managedobject type as condition but I was able to achieve update of database by this concept in ObjC.

And another problem is when I try to compile I get an error as -

failed to call designated initializer on NSManagedObject class 'NSManagedObject'

in the prepereforsegue() method. So how to solve the problem and perform update.

解决方案

This line is wrong because you're trying to create an invalid managed object instance:

var managedobjectt = NSManagedObject()

It should be

var managedobjectt : NSManagedObject?

And when you update you aren't changing the current item if it exists, you're just always creating a new instance. You should

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

这篇关于核心数据更新swift当选择列表中的任何行视图不工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆