
現在我把一個專案添加到購物車中時,它顯示得很正確。但是當我重新打開頁面時,資料就丟失了。我試圖將cartTableView的資料存盤在userdefaults中。我嘗試了幾種方法,但都沒能成功。 下面是我的cartViewController的代碼:
import UIKit
class CartViewController。UIViewController, UITableViewDataSource, UITableViewDelegate{
var arrdata = [jsonstruct]()
var categorydata = [Categories]()
var imgdata = [Images] ()
var cartArray = [CartStruct] ()
@IBOutlet var cartTableView: UITableView!
@IBOutlet var totalCount: UILabel!
@IBOutlet var subtotalPrice: UILabel!
@IBOutlet var shippingPrice: UILabel!
@IBOutlet var totalPrice: UILabel!
@IBOutlet var proceedBtn: UIB button!
override func viewDidLoad() {
super.viewDidLoad()
cartArray = (UserDefaults.standard. array(forKey: "cartt") as? [CartStruct])!
cartTableView.reloadData()
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1 {
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cartArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CartCellTableViewCell", for: indexPath) as! CartCellTableViewCell
cell.cartImageView.downloadImage(from: cartArray[indexPath.row].cartItems.images.first?.src ? "place_holder_image")
cell.productNameCart.text = cartArray[indexPath.row]. cartItems.name
cell.prodductDescCart.text = cartArray[indexPath.row].cartItems.categories.first?.type
cell.productPriceCart.text = cartArray[indexPath.row].cartItems.price
cell.addBtn.addTarget(self, action: #selector(add(sender:)),for: .touchUpInside)
cell.addBtn.tag = indexPath.row
let cartQuantity = cartArray[indexPath.row]. cartQuantity
cell.prodCount.text = "(cartQuantity)"
if cartQuantity >= 0 {
cell.subBtn.isUserInteractionEnabled = true。
cell.subBtn.addTarget(self, action: #selector(sub(sender:)),for: .touchUpInside)
cell.subBtn.tag = indexPath.row
} else {
cell.subBtn.isUserInteractionEnabled = false;
}
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath。IndexPath) {
if editingStyle == .delete {
cartArray.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
tableView.reloadData()
}
}
@objc func add(sender: UIButton){
if cartArray[sender.tag].cartQuantity >= 0{
cartArray[sender.tag].cartQuantity = 1 ?
cartTableView.reloadData()
}
}
@objc func sub(sender: UIButton){
if cartArray[sender.tag].cartQuantity >/span> 0 {
cartArray[sender.tag].cartQuantity -= 1 ?
cartTableView.reloadData()
}
}
}
但是這里顯示了一些運行時錯誤:" Thread 1: Swift runtime failure: force unwrapped a nil value "
。請建議我如何才能解決整個問題。謝謝你的建議!
請建議我如何解決整個問題。
uj5u.com熱心網友回復:
你可以使用UserDefaults,但你應該使用核心資料或境界以獲得更好的性能。
如何使用這段代碼?
// 保存。
CartCache.save([Cart])
//獲取資料。 let cart = CartCartCache.get()
struct CartCache {
static let key = "CartCache"
static func save(_ value: [CartStruct]!) {
UserDefaults.standard.set(try? PropertyListEncoder().encode(value), forKey: key)
}
static func get() -> [CartStruct]! {
var cartData: User!
if let data = UserDefaults. standard.value(forKey: key) as? Data {
cartData = try? PropertyListDecoder().Decode([User].self, from: data)
return cartData!
} else {
return [] 。
}
}
static func remove() {
UserDefaults.standard.removeObject(forKey: key)
}
}
uj5u.com熱心網友回復:
你應該使用除用戶默認值之外的不同的資料保存方法。用戶默認值主要用于保存小的資訊,如姓名、用戶名、性別等。我建議你使用核心資料而不是用戶默認值,這里有一個非常有用的解釋和核心資料的示例專案。
https://www.raywenderlich.com/7569-getting-started-with-core-data-tutorial
祝您有一個愉快的一天:)
uj5u.com熱心網友回復:
正如許多人提到的,UserDefaults并不是用來存盤這類資料的。 從檔案中可以看出:
UserDefaults類為與默認系統的互動提供了一個編程介面。默認系統允許應用程式自定義其行為以匹配用戶的偏好。例如,你可以讓用戶指定他們喜歡的測量單位或媒體播放速度。應用程式通過給用戶的默認資料庫中的一組引數賦值來存盤這些偏好。這些引數被稱為默認值,因為它們通常被用來確定應用程式在啟動時的默認狀態或其默認的行為方式。
然而,我覺得這仍然是一個有效的問題,也是每個 IOS/MacOS 開發人員應該知道如何使用的東西。
NSUserDefaults 很簡單,易于使用,但有一些事情你必須了解。
即你只能存盤屬性串列項。
默認物件必須是一個屬性串列--即NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary的實體(或者對于集合,是這些實體的組合)。如果你想存盤任何其他型別的物件,你通常應該將其歸檔以創建一個NSData的實體。
這意味著CartStruct不能簡單地被持久化在UserDefaults中,因為它不是NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary或它們的組合。
現在使用UserDefaults很簡單,他們有一個應用的單子,叫做標準。
UserDefaults.standard.setValue("Hello Defaults"/span>, forKey: "Hello_Key")
let greeting = UserDefaults.standard.value(forKey: "Hello_Key")
print(greeting!)//列印Hello Dafaults。
下一個問題變成了如何將你的結構變成資料。我相信,如果你在這里提出這個問題,并貼出結構的代碼,你會得到一個快速而簡單的解決方案。一旦您有了資料,您可以將其保存在UserDefaults中,或者最好保存在檔案系統中。事實上,我認為這才是你想問的問題,即如何堅持和檢索結構資料,以便在表視圖中使用。
uj5u.com熱心網友回復:
是的,我們可以存盤在 UserDefaults 中,但與 Core Data 或其他用于添加、更新或洗掉操作的存盤相比,它不夠靈活。
下面的代碼應該是可行的。
你需要使 "CartStruct "成為可編碼的
。struct CartStruct : Codable {
var cartItems: jsonstruct
var cartQuantity: Int
}
接下來,把這個添加到插件中,并把它存盤在 "addToCartbtnTapped "中。(DetailViewController)
func saveCart(data: CartStruct) {
let defaults = UserDefaults.standard
if let cdata = defaults.data(forKey: "cartt" /span>) {
var cartArray = try! PropertyListDecoder().decode([CartStruct].self, from: cdata)
cartArray.append(data)
cartCount.text = "(cartArray.count)"
if let updatedCart = try? PropertyListEncoder().encode(cartArray) {
UserDefaults.standard.set(upedCart, forKey: "cartt"/span>)
}
}
}
@IBAction func addToCartbtnTapped(_ sender。Any) {
if let info = detailInfo {
let cartData = CartStruct( cartItems: info, cartQuantity: 1)
self.saveCart(data: cartData)
顯示警報()
(sender as AnyObject).setTitle("Go to Cart" , for: .normal)
addToCartbtn.isUserInteractionEnabled = false。
}
}
@IBAction func cartTappedToNavigate(_ sender: Any) {
let cart = self.storyboard? . instantiateViewController(withIdentifier: "CartViewController") as? CartViewController。
self.navigationController?.pushViewController(cart!, animated: true)
}
現在,從你存盤的地方獲取你的購物車資料。(CartViewController)
override func viewDidLoad() {
super.viewDidLoad()
self.getCartData()
}
func getCartData() {
let defaults = UserDefaults.standard
if let data = defaults.data(forKey: "cartt" /span>) {
cartArray = try! PropertyListDecoder().decode([CartStruct].self, from: data)
cartTableView.reloadData()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311696.html
標籤:
上一篇:相機校準,焦距值似乎太大
下一篇:改變表格中第一個單元格的背景影像
