如何从 UITableView 中删除行并从 Swift / iOS 中的 UserDefaults 更新数组
How to delete rows from UITableView and update array from UserDefaults in Swift / iOS
我已经完成 从 UITableView 中删除行并从 UserDefaults 更新数组。但是没用。
这是我从表视图中删除行的代码。但它没有存储在 userdefaults
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()
}
}
请建议我如何解决这个问题。提前致谢!
更新:
这是我的(电子商务应用程序的)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: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
self.getCartData()
let userDefaults = UserDefaults.standard
guard let data = userDefaults.array(forKey: "myArrayKey") as? [CartStruct] else {
return
}
cartArray = data
cartTableView.reloadData()
}
func getCartData() {
let defaults = UserDefaults.standard
if let data = defaults.data(forKey: "cartt") {
cartArray = try! PropertyListDecoder().decode([CartStruct].self, from: data)
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: .automatic)
let userDefaults = UserDefaults.standard
userDefaults.set(cartArray, forKey: "myArrayKey")
}
}
@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 > 0 {
cartArray[sender.tag].cartQuantity -= 1
cartTableView.reloadData()
}
}
}
您正在尝试对非属性 列表对象进行操作。
您必须遵循以下提到的步骤:
根据“[CartStruct]”
从 UserDefaults 解析您的购物车数据
检查并删除。
删除后更新为UserDefaults
重新加载您的 TableView
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
cartArray = self.updateCartItems(name: cartArray[indexPath.row].cartItems.name)
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
这里,您需要勾选并删除:
func updateCartItems(name: String) -> [CartStruct] {
guard var cartItems = self.getCartData() else { return [] }
cartItems = cartItems.filter({ [=11=].cartItems.name != name })
if let updatedCart = try? PropertyListEncoder().encode(cartItems) {
UserDefaults.standard.set(updatedCart, forKey: "cartt")
}
UserDefaults.standard.set(cartItems.count, forKey: "CountAddedProducts")
return cartItems
}
我已经完成
这是我从表视图中删除行的代码。但它没有存储在 userdefaults
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()
}
}
请建议我如何解决这个问题。提前致谢!
更新:
这是我的(电子商务应用程序的)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: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
self.getCartData()
let userDefaults = UserDefaults.standard
guard let data = userDefaults.array(forKey: "myArrayKey") as? [CartStruct] else {
return
}
cartArray = data
cartTableView.reloadData()
}
func getCartData() {
let defaults = UserDefaults.standard
if let data = defaults.data(forKey: "cartt") {
cartArray = try! PropertyListDecoder().decode([CartStruct].self, from: data)
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: .automatic)
let userDefaults = UserDefaults.standard
userDefaults.set(cartArray, forKey: "myArrayKey")
}
}
@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 > 0 {
cartArray[sender.tag].cartQuantity -= 1
cartTableView.reloadData()
}
}
}
您正在尝试对非属性 列表对象进行操作。
您必须遵循以下提到的步骤:
根据“[CartStruct]”
从 UserDefaults 解析您的购物车数据检查并删除。
删除后更新为UserDefaults
重新加载您的 TableView
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { cartArray = self.updateCartItems(name: cartArray[indexPath.row].cartItems.name) tableView.deleteRows(at: [indexPath], with: .fade) } }
这里,您需要勾选并删除:
func updateCartItems(name: String) -> [CartStruct] {
guard var cartItems = self.getCartData() else { return [] }
cartItems = cartItems.filter({ [=11=].cartItems.name != name })
if let updatedCart = try? PropertyListEncoder().encode(cartItems) {
UserDefaults.standard.set(updatedCart, forKey: "cartt")
}
UserDefaults.standard.set(cartItems.count, forKey: "CountAddedProducts")
return cartItems
}