编辑操作在核心数据中不起作用

Edit operation is not working in Core Data

我正在处理核心数据 crud operation.I' Person 对象,当用户单击添加 (+) 按钮时,用户可以添加人名,人名将显示在 tableview 中。当用户单击任何 tableView 单元格时,它会在警报文本字段中显示警报和当前点击单元格的人员,用户可以编辑人员的姓名,但我的逻辑工作不正常,用户没有 editing.I 还有一个问题就像当我 运行 应用程序时,以前的用户记录没有显示,但它会在我输入新用户并获取所有以前的用户后显示,请查看代码并提前指导我。

ViewController Class:

@IBOutlet weak var tableView: UITableView!
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

var items : [Person] = [] {
    didSet{
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}
override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.delegate = self
    self.tableView.dataSource = self
    tableView.register(UINib(nibName: String(describing: StundentCell.self), bundle: .main), forCellReuseIdentifier: String(describing: StundentCell.self))
   
}
@IBAction func addPerson(_ sender: UIBarButtonItem) {
    showAlert()
}

private  func showAlert(_ title:String = "Add new Item", message: String = "what is your name"){
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
    alertController.addTextField()
    let subbmitBtn = UIAlertAction(title: "Add Person", style: .default) { (action) in
        let textField = alertController.textFields![0]
        let newPerson = Person(context:self.context)
        newPerson.name = textField.text
        newPerson.age = 20
        newPerson.gender = "Male"
        do {
            try self.context.save()
        }
        catch{
            
        }
        self.fetchPerople()
        }
    alertController.addAction(subbmitBtn)
    self.present(alertController, animated: true, completion: nil)
    
}

func fetchPerople(){
    do{
        self.items = try context.fetch(Person.fetchRequest())
    }
    catch{
        
    }
}
}

extension ViewController: UITableViewDelegate,UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    self.configurePersonCell(tableView, cellForRowAt: indexPath)
}


func configurePersonCell(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    guard let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: StundentCell.self)) as? StundentCell else {return UITableViewCell()}
    cell.studentData = items[indexPath.row]
    cell.delete.tag = indexPath.row
    cell.delete.addTarget(self, action: #selector(deleteRecord(sender:)), for: .touchUpInside)
    return cell
 }

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    var person =  items[indexPath.row].name
    let alertController = UIAlertController(title: "Edit Person", message: "Edit name", preferredStyle: .alert)
    alertController.addTextField()
    let alertField = alertController.textFields![0]
    alertField.text = person
    
    let saveBtn = UIAlertAction(title: "Save", style: .default) { (action) in
        let getName = alertController.textFields![0]
        person = getName.text
        
        do{
            try self.context.save()
        }
        catch{
            
        }
        self.fetchPerople()
    }
    alertController.addAction(saveBtn)
    self.present(alertController, animated: true, completion: nil)
}

func gotoPersonDetails(personData:Person){
   
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 50
}
@objc func deleteRecord(sender: UIButton){
    if items.count > 0{
        let personRemove = self.items[sender.tag]
        self.context.delete(personRemove)
        
        do {
            try self.context.save()
        }
        catch{
            
        }
        self.fetchPerople()
        
    }
}


@IBOutlet weak var tableView: UITableView!
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

var items : [Person] = [] {
    didSet{
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}
override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.delegate = self
    self.tableView.dataSource = self
    tableView.register(UINib(nibName: String(describing: StundentCell.self), bundle: .main), forCellReuseIdentifier: String(describing: StundentCell.self))
   
}
@IBAction func addPerson(_ sender: UIBarButtonItem) {
    showAlert()
}

private  func showAlert(_ title:String = "Add new Item", message: String = "what is your name"){
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
    alertController.addTextField()
    let subbmitBtn = UIAlertAction(title: "Add Person", style: .default) { (action) in
        let textField = alertController.textFields![0]
        let newPerson = Person(context:self.context)
        newPerson.name = textField.text
        newPerson.age = 20
        newPerson.gender = "Male"
        do {
            try self.context.save()
        }
        catch{
            
        }
        self.fetchPerople()
        }
    alertController.addAction(subbmitBtn)
    self.present(alertController, animated: true, completion: nil)
    
}

func fetchPerople(){
    do{
        self.items = try context.fetch(Person.fetchRequest())
    }
    catch{
        
    }
   
}


}


extension ViewController: UITableViewDelegate,UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    self.configurePersonCell(tableView, cellForRowAt: indexPath)
}


func configurePersonCell(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    guard let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: StundentCell.self)) as? StundentCell else {return UITableViewCell()}
    cell.studentData = items[indexPath.row]
    cell.delete.tag = indexPath.row
    cell.delete.addTarget(self, action: #selector(deleteRecord(sender:)), for: .touchUpInside)
    return cell
 }

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    var person =  items[indexPath.row].name
   

    let alertController = UIAlertController(title: "Edit Person", message: "Edit name", preferredStyle: .alert)
    alertController.addTextField()
    let alertField = alertController.textFields![0]
    alertField.text = person
    
    let saveBtn = UIAlertAction(title: "Save", style: .default) { (action) in
        //get the person name in alert text field
        let getName = alertController.textFields![0]
        //edit the name of the person object
        person = getName.text
        
        do{
            try self.context.save()
        }
        catch{
            
        }
        self.fetchPerople()
    }
    alertController.addAction(saveBtn)
    self.present(alertController, animated: true, completion: nil)
}

func gotoPersonDetails(personData:Person){
   
}


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 50
}
@objc func deleteRecord(sender: UIButton){
    
    /* fro api calling or firebase for deleting the rows in tableview
    if items.count > 0 {
        items.remove(at:sender.tag)
    }
*/
    
    if items.count > 0{
        let personRemove = self.items[sender.tag]
        //remove the person
        self.context.delete(personRemove)
        
        //save the data
        do {
            try self.context.save()
        }
        catch{
            
        }
        //refetch the data
        self.fetchPerople()
        
    }
}

您正在修改名称字符串,但没有更新记录。

得到整个个人

let person = items[indexPath.row] // can be a constant because it's reference type

为文本字段指定名称

alertField.text = person.name

并重新分配编辑后的名称

let nameField = alertController.textFields![0]
person.name = nameField.text

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let person = items[indexPath.row]
    let alertController = UIAlertController(title: "Edit Person", message: "Edit name", preferredStyle: .alert)
    alertController.addTextField()
    let alertField = alertController.textFields![0]
    alertField.text = person.name
    
    let saveBtn = UIAlertAction(title: "Save", style: .default) { (action) in
        let nameField = alertController.textFields![0]
        person.name = nameField.text
        
        do{
            try self.context.save()
        }
        catch{
            
        }
        self.fetchPerople()
    }
    alertController.addAction(saveBtn)
    self.present(alertController, animated: true, completion: nil)
}