【发布时间】:2020-04-05 08:41:39
【问题描述】:
我在将表视图数据保存为用户默认值时遇到问题,我在加载函数中收到错误“无法将类型 '[String]' 的值分配给类型 '[ViewController.ItemRow]'”。它在“items = loadedData”行给出错误。有谁知道它为什么给我这个错误!我不知道我是否做得对。
import UIKit
import SafariServices
class ViewController: UIViewController, UIAdaptivePresentationControllerDelegate, UITextFieldDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var OrderNumberLabel: RoundedLabel2!
@IBOutlet weak var CostLabel: RoundedLabel2!
@IBOutlet weak var ProfitLabel: RoundedLabel2!
@IBOutlet weak var TotalLabel: RoundedLabel2!
@IBOutlet weak var itemTextField: UITextField!
@IBOutlet weak var priceTextField: UITextField!
@IBOutlet weak var saleTextField: UITextField!
var items: [ItemRow] = []
struct ItemRow
{
var first: String
var second: String
var third: String
}
override func viewDidLoad() {
super.viewDidLoad()
load()
// tableView.tableFooterView = UIView(frame: CGRect.zero)
}
func save(){
UserDefaults.standard.set(items, forKey: "saved")
}
func load(){
if let loadedData:[String] = UserDefaults.standard.value(forKey: "saved") as? [String]{
items = loadedData
tableView.reloadData()
}
}
@IBAction func addButtonTapped(_ sender: Any) {
insertNewItems()
save()
// profit()
//
}
// func profit(){
// let priceValue = Double(priceTextField.text!)
// let saleValue = Double(saleTextField.text!)
//
// if priceValue != nil && saleValue != nil {
//
// let outputValue = Double (priceValue! - saleValue!)
//
// ProfitLabel.text = "\(outputValue)"
// }
// }
func insertNewItems() {
let newVideoRow = ItemRow(first: itemTextField.text!, second: priceTextField.text!, third: saleTextField.text!)
items.append(newVideoRow)
let indexPath = IndexPath(row: items.count - 1, section: 0)
tableView.beginUpdates()
tableView.insertRows(at: [indexPath], with: .automatic)
tableView.endUpdates()
itemTextField.text = ""
priceTextField.text = ""
saleTextField.text = ""
view.endEditing(true)
}
}
extension ViewController: UITableViewDelegate{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let ItemTitle = items[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell") as! ItemCell
cell.itemLabel.text = ItemTitle.first
cell.priceLabel.text = ItemTitle.second
cell.saleLabel.text = ItemTitle.third
return cell
}
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
items.remove(at: indexPath.row)
tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: .automatic)
tableView.endUpdates()
save()
}
}
}
【问题讨论】:
-
您将项目保存为
struct,而不是string。 -
items是[ItemRow],而不是[String] -
它必须是一个结构,所以我该如何修复
-
可能你必须在loadedData中以[ItemRow]而不是[String]的形式获取数据