使用UITableView单元格中的segue更新数据



我有一个将信息保存到coreData的用户表单。我正在努力解决将信息填充回formViewControll并允许更改信息的步骤。我已经研究了几天了,还没能实现一个有效的解决方案。以下是我的想法,但它确实很有用。窗体ViewController给出以下错误:无法调用非函数类型"OTSProcess?"的值ListVC给出错误:无法将类型为"OTSProcessConfirmations"的值分配给类型为"OTSProcess?">

下面的代码允许我输入和删除值。我正在努力更新/编辑部分,在那里我使用委托将桥接到两个vewController以显示完整信息并允许更新。

ViewControll(返回coreData信息的表格视图)

import UIKit
import CoreData
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var otsProcessConfirmations: [OTSProcessConfirmation] = []
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return otsProcessConfirmations.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
let ots = otsProcessConfirmations[indexPath.row]
cell.textLabel?.text = ots.otsBranch
cell.detailTextLabel?.text = String(describing: otsProcessConfirmations[indexPath.row].otsDate)
return cell
}
override func viewWillAppear(_ animated: Bool) {
// get the data from core data
getData()

/// reload the table view
tableView.reloadData()
}
func getData() {
let fetchRequest: NSFetchRequest<OTSProcessConfirmation> = OTSProcessConfirmation.fetchRequest()
do {
otsProcessConfirmations = try PersistenceService.context.fetch(fetchRequest)
}
catch{
print("Fetching Failed")
}
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
let context = PersistenceService.context
if editingStyle == .delete {
let ots = otsProcessConfirmations[indexPath.row]
context.delete(ots)
PersistenceService.saveContext()
do {
otsProcessConfirmations = try context.fetch(OTSProcessConfirmation.fetchRequest())
}
catch {
print("Fetching Failed")
}
}
tableView.reloadData()
}}

表单视图控制器(我没有包含创建表单的代码

import UIKit
import CoreData
import Eureka
class OTSPCViewController: FormViewController {
var otsBranch: String = ""
var otsDate: Date = Date()
var otsComments: String = ""
var otsQ1: Bool = false
var otsQ2: Bool = false
var otsQ3: Bool = false
var otsQ4: Bool = false
var otsQ5: Bool = false
var otsQ6: Bool = false
var otsQ7: Bool = false
var otsQ8: Bool = false
var otsQ9: Bool = false
var otsQ10: Bool = false
var otsQ11: Bool = false
var otsQ12: Bool = false
var otsQ13: Bool = false
var otsQ14: Bool = false

var otsProcessConfirmations = [OTSProcessConfirmation]()
@IBAction func addOTSProcessConfirmation(_ sender: UIBarButtonItem) {
// create the object and add all its parts
let otsProcessConfirmation = OTSProcessConfirmation(context: PersistenceService.context)
otsProcessConfirmation.otsBranch = otsBranch
otsProcessConfirmation.otsDate = otsDate as NSDate
otsProcessConfirmation.otsComments = otsComments
otsProcessConfirmation.otsQ1 = otsQ1
otsProcessConfirmation.otsQ2 = otsQ2
otsProcessConfirmation.otsQ3 = otsQ3
otsProcessConfirmation.otsQ4 = otsQ4
otsProcessConfirmation.otsQ5 = otsQ5
otsProcessConfirmation.otsQ6 = otsQ6
otsProcessConfirmation.otsQ7 = otsQ7
otsProcessConfirmation.otsQ8 = otsQ8
otsProcessConfirmation.otsQ9 = otsQ9
otsProcessConfirmation.otsQ10 = otsQ10
otsProcessConfirmation.otsQ11 = otsQ11
otsProcessConfirmation.otsQ12 = otsQ12
otsProcessConfirmation.otsQ13 = otsQ13
otsProcessConfirmation.otsQ14 = otsQ14
// save information to CoreDate
PersistenceService.saveContext()
}

从视图返回数据流的最佳实践是使用delegate。如果你还没有,我强烈建议你尽可能多地阅读Swift中的代表/协议是如何工作的——它们会让你的生活变得更好。

您当前的代码没有很好地遵守最佳实践(抱歉),所以我对以下内容进行了一些自由处理,但您需要实现它:

首先创建委托:

protocol YourDataDelegate: class {
func updatedData()
}

第二:让你的演示ViewController遵守委托:

extension: ListViewController: YourDataDelegate {
func updatedData() {
tableView.reloadData()
}
}

第三:然后委托您的FormViewController

... all your above code...
var OTSProcess:OTSProcess?
weak var delegate: YourDataDelegate?
... all your below code...

第四:在准备时设置代理

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let formViewController = segue.destination as? FormViewController  {
let indexpath = self.tableView.indexPathForSelectedRow
let row = indexpath?.row
formViewController.OTSProcess = OTSs[row!]
formViewController.delegate = self
}
}
}

第五个也是最后一个:你需要将一个委托放入你的FormVC中,并在数据更新时调用它:

@IBAction func BtnSave(_ sender: Any) {
... all your above code...
delegate?.updatedData()
navigationController!.popViewController(animated: true)
}

你可以把这看作是把底部视图控制器的一小部分传递给顶部视图控制器,这样他们就可以相互交谈,但要以特定的方式进行,但你最好阅读这个概念,并清理这里的代码(大量强制展开…)

最新更新