我有一个用户表单,可以将信息保存到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()
}
答案 0 :(得分:0)
从视图中返回数据流的最佳做法是使用delegate
。如果你还没有,我强烈建议尽可能多地阅读代表/协议如何在Swift中工作 - 它们会让你的生活更美好。
您当前的代码不能很好地遵循最佳实践(抱歉),所以我对以下内容采取了一些自由,但您需要实现以下内容:
首先创建委托:
protocol YourDataDelegate: class {
func updatedData()
}
SECOND:让你的presentationViewController遵守委托:
extension: ListViewController: YourDataDelegate {
func updatedData() {
tableView.reloadData()
}
}
THIRD:然后是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)
}
您可以将此视为将底部视图控制器的一小部分传递给顶部视图控制器,这样他们就可以互相交谈,但是以特定的方式,但您最好阅读这个概念并清理这里的代码也很多(很多力展开......)。