首页 > 解决方案 > 试图在两个视图控制器之间传递核心数据

问题描述

所以我现在刚刚熟悉 Core Data 并通过 Raywenderlich.com 在 2 个 VC 之间传递数据,我有点卡在一个简单的项目上。到目前为止,我已经能够做一些我想做的事情,但我遇到了一个错误——我知道是什么导致了它,但不确定我能做些什么来修复它

基本上,我有两个视图控制器:(1)显示添加到 UITableView 列表中的所有项目,以及(2)将项目添加到表视图的选项。

这是我的主视图控制器:

import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDataSource, 
UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

private var finalItems:[Shoe] = []
var finalName = ""
var finalBuy = ""
var finalSell = ""
var finalFee = ""

private var appDelegate = UIApplication.shared.delegate as! AppDelegate

private var managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext


//MARK: Functions
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return finalItems.count
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{

    let cell = tableView.dequeueReusableCell(withIdentifier: "ShoeCell", for: indexPath) as! CustomCells
    let shoe = finalItems[indexPath.row]

    cell.Name.text = "Name: \(shoe.name!)"
    cell.buyPrice.text = "Age: $\(shoe.buyPrice!)"
    cell.sellPrice.text = "Height: $\(shoe.sellPrice!)"
    cell.transFee.text = "Gender: \(shoe.fee!)"

    return cell
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let nameToSave = finalName
    let buyToSave = finalBuy
    let sellToSave = finalSell
    let feeToSave = finalFee

    let shoe = Shoe(entity: Shoe.entity(), insertInto: managedContext)
    shoe.name = nameToSave
    shoe.buyPrice = buyToSave
    shoe.sellPrice = sellToSave
    shoe.fee = feeToSave

    if(finalName != "" && finalBuy != "" && finalSell != "" && finalFee != ""){

    do {
        try managedContext.save()
        appDelegate.saveContext()
        finalItems.append(shoe)
    } catch let error as NSError {
        print("Error saving: \(error)")
        }

    }

    // Fetch a request to retrieve the data again
    do {
        finalItems = try managedContext.fetch(Shoe.fetchRequest())
    } catch let error as NSError {
        print("Error fetching request: \(error)")
    }

}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    tableView.reloadData()
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self
}

}

基本上,我有这样的思考过程:一旦数据通过 segue,它首先会检查数据字段是否为空白(因此,If 语句)。如果为空,则不会将任何数据附加到数组中,也不会将任何内容保存到核心数据中。继续前进,由于没有保存任何内容,因此不应获取任何内容,从而单独留下表格视图。

实际发生的情况是,每次我运行应用程序时,都会发生完全相反的情况:我收到文本但没有数据,我相信这是因为我已经finalName设置了""等等。

这是另一个实际添加项目的视图控制器:

class AddViewController: UIViewController {

private var shoeItems:[Shoe] = []
var addName = ""
var addBuy = ""
var addSell = ""
var addFee = ""

@IBOutlet weak var nameText: UITextField!
@IBOutlet weak var buyText: UITextField!
@IBOutlet weak var sellText: UITextField!
@IBOutlet weak var feeText: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func addItem(_ sender: Any) {

    self.addName = nameText.text!
    self.addBuy = buyText.text!
    self.addSell = sellText.text!
    self.addFee = feeText.text!

    performSegue(withIdentifier: "addShoe", sender: self)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as! ViewController
        vc.finalName = self.addName
        vc.finalBuy = self.addBuy
        vc.finalSell = self.addSell
        vc.finalFee = self.addFee
}
}

如果它只是一个标签,我能够成功地将数据传递给另一个 VC,但是在添加数组以填充 UITableView 时,这就是我感到困惑的地方。我尝试过其他解决方案(失败的解决方案),例如使用全局数组并通过 segue 传递数组,但这似乎不起作用。

标签: swiftuitableviewcore-datasegue

解决方案


推荐阅读