ios - 在 Swift 中编辑 TableViewCell 的内容列表

标签 ios swift core-data uitableview

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

现在,我正在通过将选定的 TableViewCell 链接到下一个 ViewController 上的 UITextView 来进行编辑。我已在 上创建了一个“DONE”操作>ViewController.I 能够使用 Segue 将数据从选定的 Cell 传递到下一个 ViewController 的 TextView。

现在,我需要通过单击“DONE”按钮返回到 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.
}

}

最佳答案

将您的 CoreData 模型引用传递到下一个屏幕:

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

希望这会起作用......!!

关于ios - 在 Swift 中编辑 TableViewCell 的内容列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41374399/

相关文章:

ios - UILabel 显示的是最后一个值,但不是我输入的所有值

arrays - 从数组索引列表创建子数组

ios - 没有上下文的 CoreData 关系设置?

ios - 在 Swift 中通过 SQLite 数据库导入和查询 - iOS

ios - 当点击 UITableView 单元格时,我将如何显示 UIDatePicker?

iphone - 共享核心数据和图像到 iCloud

iphone - 如何确定 NSManagedObject 是否永久?

iphone - iOS 7 更新对我的应用的影响

ios - UIView 不允许向下滑动以查看屏幕的其余部分

ios - 删除过期的配置文件