在 Swift 中编辑 TableViewCell 的内容列表

Edit the contents list of TableViewCell in Swift

我有一个 TableViewController,其中包含使用 CoreData 的数据输入列表。我还有 ViewControllerUITextView,由 Segue 链接到 TableViewController。我已经完成了项目的添加、保存和删除操作。

现在我正在通过将所选 TableViewCell 链接到下一个 ViewController 上的 UITextView 进行编辑。我已经创建了一个在 ViewController.I 上完成的操作,我可以通过使用 Segue.

从选定单元格到下一个 ViewController 的 TextView 的数据

现在,我需要通过单击“完成”按钮返回到 TableViewController 的单元格来更新 UITextView 上编辑的文本,并将数据保存到 CoreData。请给出真正的意见和建议....我是 Swift 的新手,我在这里附上了我的代码。

import UIKit
import CoreData

class ToDoTableViewController: UITableViewController {
var listItems = [NSManagedObject]()

override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self , action: #selector(ToDoTableViewController.addItem))
}

func addItem(){
let alertController = UIAlertController(title: "To Do Tasks Lists!!!!", message: "Write Down...", preferredStyle: .alert)
let confirmAction = UIAlertAction(title: "Confirm", style: UIAlertActionStyle.default, handler: ({
    (_) in
    if let field = alertController.textFields![0] as? UITextField {
        self.saveItem(itemToSave: (field.text!))
        self.tableView.reloadData()
    }
    }
))

let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)
alertController.addTextField(configurationHandler: ({
    (textField) in
    textField.placeholder = "Type in Something!!!!"
}))

alertController.addAction(confirmAction)
alertController.addAction(cancelAction)
self.present(alertController, animated: true, completion: nil)
}

func saveItem(itemToSave : String){
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let entity = NSEntityDescription.entity(forEntityName: "ListEntity", in: managedContext)
let item = NSManagedObject(entity: entity!, insertInto: managedContext)
item.setValue(itemToSave, forKey: "item")
do {
    try managedContext.save()
    listItems.append(item)
}
catch {

    print("Error")
}
}

override func viewWillAppear(_ animated: Bool) {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ListEntity")

do{
    let results = try managedContext.fetch(fetchRequest)
    listItems = results as! [NSManagedObject]
}
catch {
    print("Error")
}
}

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let objectToDelete = listItems[indexPath.row]
    listItems.remove(at: indexPath.row)
    managedContext.delete(objectToDelete)
    tableView.deleteRows(at: [indexPath], with: .fade)
    do {
        try managedContext.save()
    }
    catch {
        print("Error")
    }
}
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return listItems.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! as UITableViewCell
let item = listItems[indexPath.row]
cell.textLabel?.text = item.value(forKey: "item") as! String?
cell.backgroundColor = UIColor.clear
return cell
}

func getIndexPathForSelectedCell() -> IndexPath?
{
var indexPath2:IndexPath?
if tableView.indexPathsForSelectedRows!.count > 0 {
    indexPath2 = tableView.indexPathsForSelectedRows![0]
}
return indexPath2
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "detailView")
{
    if let indexPath2 = getIndexPathForSelectedCell()
    {
        // here write code for move to next controller.
        let vc = segue.destination as! TextEditViewController
        //vc.FirstString =  listItems[(indexPath2 as NSIndexPath).row] as String

        let item = listItems[(indexPath2 as NSIndexPath).row]
        vc.FirstString = (item.value(forKey: "item") as! String?)!
    }
}
}

}


//TextEditViewController
import UIKit
import CoreData
class TextEditViewController: UIViewController {
@IBOutlet weak var textEdit: UITextView!
var FirstString = String()    

override func viewDidLoad() {
super.viewDidLoad()
textEdit.text = FirstString
print(self.FirstString)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

}

将您的核心数据模型引用传递到下一个屏幕:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "detailView")
{
    if let indexPath2 = getIndexPathForSelectedCell()
    {
        // here write code for move to next controller.
        let vc = segue.destination as! TextEditViewController
        //vc.FirstString =  listItems[(indexPath2 as NSIndexPath).row] as String
        let item = listItems[(indexPath2 as NSIndexPath).row]
        vc.FirstString = (item.value(forKey: "item") as! String?)!
        vc.recentItem = item; //Like this. Create a recentItem refrence to your next controller of NSManagedObject or your custom core data modal.
    }
}
}

当您在 TextEditViewController 中完成编辑后:

recentItem.item = "String" //Your updated string

let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
do {
        try managedContext.save()
    }
    catch {
        print("Error")
    }

希望这会奏效...!!