在 Swift 中编辑 TableViewCell 的内容列表

Posted

技术标签:

【中文标题】在 Swift 中编辑 TableViewCell 的内容列表【英文标题】:Edit the contents list of TableViewCell in Swift 【发布时间】:2016-12-29 06:38:32 【问题描述】:

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

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

现在,我需要更新UITextView 上的编辑文本,方法是单击完成按钮返回TableViewController 的单元格,并将数据保存到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.



【问题讨论】:

打印项目数据并在那里调试并检查它 Himanshu Moradiya @U 没有任何想法 ,,,... 你来这里只是为了获得支持和批准的诱饵。你之前没有解决我的问题!! 在 secondVC 上编辑后是否要更新 coredata 中的文本并将其显示到 FirstVC 上的 tableview 中? 是的,先生......请帮助我......我已经把所有东西都写在那里了@Dheeraj D @AngelKajol 检查我的答案,我为您提供了如何在您的案例中使用核心数据的简单逻辑。 【参考方案1】:

将您的 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")
    

希望这会奏效...!!

【讨论】:

我应该在哪里添加这个先生?? recentItem.item = "String" //你更新的字符串 let appDelegate = UIApplication.shared.delegate as! AppDelegate let managedContext = appDelegate.managedObjectContext do try managedContext.save() catch print("Error") If U wish 可以编辑我问的问题。 @Dheeraj D 完成编辑后,在 TextViewController 中写入 recent.item = string。以及完成按钮操作中的所有剩余代码 让我检查一下,我会回复你的

以上是关于在 Swift 中编辑 TableViewCell 的内容列表的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何以编程方式在 TableViewCell 中显示 CollectionView

如何在 Swift 3.0 中选择 JSON 输出到 TableViewCell 中?

在 TableViewCell 中保持 UISwitch 的状态:Swift

无法在 Swift 中展开和折叠 TableViewCell

在swift 3中的tableview中更新tableviewcell中的特定行?

滚动时 TableViewCell 中的 Swift 3 UISwitch 丢失状态