swift - 试图在两个视图控制器之间传递核心数据
问题描述
所以我现在刚刚熟悉 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 传递数组,但这似乎不起作用。
解决方案
推荐阅读
- c# - System.Data.SqlClient.SqlException:'无效的对象名称 EmpUpdate'
- c++ - 在 C++ 中使用文件 I/O 从文件中删除特定键
- firebase - 我是否错过了火力基地应该如何工作的重点?
- sql - SQL -- 如何编写一个select语句来查找连续5天下订单的客户
- c# - 添加依赖注入会在 .NET Core 中产生异常
- heroku - Heroku 错误:ENOENT:没有这样的文件或目录,打开 'H:/_netrc'
- javascript - 如何从父模式中计算不同的 mongodb 模式?
- audio - 使用 FFMPEG 播放水印时降低音量
- javascript - 嵌入式 iframe 的凸轮访问
- bitbucket - 是否可以选择在 Slack 上通过 bitbucketCloud 显示更大的消息