使用来自UITableView Cell的segue更新数据

时间:2017-11-07 03:30:03

标签: ios swift uitableview core-data

我有一个用户表单,可以将信息保存到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()

}

1 个答案:

答案 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)
}

您可以将此视为将底部视图控制器的一小部分传递给顶部视图控制器,这样他们就可以互相交谈,但是以特定的方式,但您最好阅读这个概念并清理这里的代码也很多(很多力展开......)。