gpt4 book ai didi

ios - 使用 UITableView Cell 中的 segue 更新数据

转载 作者:行者123 更新时间:2023-11-30 12:01:35 25 4
gpt4 key购买 nike

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

下面的代码允许我输入和删除值。我在更新/编辑部分遇到困难,我使用委托(delegate)将两个 vewController 桥接以显示完整信息并允许更新。

ViewControll(返回coreData信息的表格 View )

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

表单 View Controller (我没有包含创建表单的代码

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()

}

最佳答案

从 View 返回数据流的最佳实践是通过使用委托(delegate)。如果您还没有,我强烈建议您尽可能多地阅读委托(delegate)/协议(protocol)在 Swift 中的工作原理——它们会让您的生活变得更好。

您当前的代码没有很好地遵循最佳实践(抱歉),因此我对以下内容进行了一些自由操作,但您需要像这样实现它:

首先创建委托(delegate):

protocol YourDataDelegate: class {
func updatedData()
}

第二:让你的presentingViewController遵守委托(delegate):

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

第三:然后委托(delegate)给您的 FormViewController

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

第四:准备时设置委托(delegate)

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

}
}
}

第五也是最后:您需要将委托(delegate)放入 FormVC 中,并在数据更新时调用它:

@IBAction func BtnSave(_ sender: Any) {
... all your above code...

delegate?.updatedData()

navigationController!.popViewController(animated: true)
}

您可以将其视为将底部 View Controller 的一小部分传递到顶部 View Controller ,以便它们可以彼此通信,但是以特定的方式,但您最好阅读这个概念,并清理也在这里添加代码(解开包装需要很大力气...)。

关于ios - 使用 UITableView Cell 中的 segue 更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47149513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com