我有一个场景,其中我有两个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()
方法中的。那么如何解决问题并进行更新。
答案 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