2017-09-07 36 views
1

我將讓用戶通過點擊表格單元格來編輯數據。用戶將選擇表格單元格,無論他們想要修改哪個數據,一個新的VC「UpdateDataViewController」將出現以前選擇的數據。用戶可以修改數據並點擊保存按鈕將編輯後的數據保存到數據庫表中。使用Swift更新從核心數據中的UITableViewCell中選擇的數據3

這裏是我的代碼:

//Code to pass the data in selected row 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "update" { 
     var path = self.tableView.indexPathForSelectedRow 
     let nav = segue.destination as! UINavigationController 
     let updateViewController = nav.topViewController as! UpdateDataViewController 

     updateViewController.index = path?.row 
     updateViewController.editPeopleList = peopleList[(path?.row)!].name 
     // let updatePersonModel = PersonModel() 
     // updateViewController.editPeopleList = [updatePersonModel.name!] 

    } 
} 

UpdateDataViewController.swift

// code to select the row and enable to edit touching any place of text field 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if indexPath.section == 0 && indexPath.row == 0 { 
     updateDataTextField.becomeFirstResponder() 
    } 
    tableView.deselectRow(at: indexPath, animated: true) 
} 

變量需要:

var index:Int? 
var editPeopleList:String! 

var updatePeopleList: String? 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    updateDataTextField.text = editPeopleList 
} 

// after editing data is replaced here: 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 

    if segue.identifier == "updateData" { 
     updatePeopleList = updateDataTextField.text 
    } 
} 

使用開卷SEGUE核心數據更新代碼:

//code for unwind segue 

@IBAction func updateDataToViewController(segue: UIStoryboardSegue) { 

    let updatePeopleData = segue.source as! UpdateDataViewController 

    let index = updatePeopleData.index 

// let dataToUpdate = peopleList[index!].name 
    let personData = updatePeopleData.updatePeopleList 


    let updatePersonName = PersonModel() 
    updatePersonName.name = personData 

    let path = self.tableView.indexPathForSelectedRow 
    let selectedPersonData = peopleList[(path?.row)!] 

    PersonServices.sharedInstance.updatePerson(updatePersonName: updatePersonName, selectedPersonData: selectedPersonData ) 
    // updatePersonModel.name = name 


    //peopleList[index!] = updatePeopleData. 
    tableView.reloadData() 
} 

這裏是核心數據更新數據更新我的功能:

func updatePerson(updatePersonName: PersonModel , selectedPersonData: PersonModel) { 

    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: PersonEntity) 

    let updatepredicates = NSPredicate(format: "name == %@" , selectedPersonData.name! ) 

    print("data to update: \(updatepredicates)") 
    print("updated data: \(String(describing: updatePersonName.name))") 

    fetchRequest.predicate = updatepredicates 
    print("after edit: \(fetchRequest)") 
     var updatePersonModels = [PersonModel](); 

do { 
     if let person = try 
     self.managedObjectContext.fetch(fetchRequest).first as? Person { 

let newPersondata = NSEntityDescription.insertNewObject(forEntityName: PersonEntity, into: managedObjectContext) 
      newPersondata.setValue("updatePersonName.name", forKey: person.name!) 

      do { 
       try self.managedObjectContext.save() 
       updatePersonModels.append(PersonModel(person: person)) 
      } catch let error as NSError { 
       print("could not save. \(error), \(error.userInfo)") 
      } 

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

,但我的應用程序在

newPersondata.setValue("updatePersonName.name", forKey: person.name!) 

中的updatePerson功能崩潰。

錯誤是:

終止應用程序由於未捕獲的異常「NSUnknownKeyException」, 原因:「[setValue方法:forUndefinedKey:]:將 實體的人不是關鍵值編碼兼容的鍵「歐麥爾」。」

回答

2

最後我做到了,Ahumdulillah。

起初,我已經改變了我「的updatePerson」功能初級講座:

func updatePerson(updatePersonName: PersonModel , selectedPersonData: PersonModel) { 

    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: PersonEntity) 

    let updatepredicates = NSPredicate(format: "name == %@" , selectedPersonData.name! ) 

    fetchRequest.predicate = updatepredicates 

     var updatePersonModels = [PersonModel](); 
do { 
     if let person = try self.managedObjectContext.fetch(fetchRequest).first as? Person { 

      person.name = updatePersonName.name 
      print("person name is: \(person.name)") 


      do { 
       try self.managedObjectContext.save() 

       updatePersonModels.append(PersonModel(person: person)) 
      } catch let error as NSError { 
       print("could not save. \(error), \(error.userInfo)") 
      } 

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

然後,在「updateDataToViewController」開卷賽格瑞功能:我剛纔已經把編輯的數據在選定的索引。

@IBAction func updateDataToViewController(segue: UIStoryboardSegue) { 

    let updatePeopleData = segue.source as! UpdateDataViewController 

    let index = updatePeopleData.index 

    let dataToUpdate = peopleList[index!].name 
    let personData = updatePeopleData.updatePeopleList 


    let updatePersonName = PersonModel() 
    updatePersonName.name = personData 



    let selectedPersonData = peopleList[index!] 

    PersonServices.sharedInstance.updatePerson(updatePersonName: updatePersonName, selectedPersonData: selectedPersonData ) 

    peopleList[(path?.row)!] = updatePersonName 
    tableView.reloadData() 
} 

完蛋了.....