gpt4 book ai didi

ios - 对使用 UserDefaults 确保删除的项目在 TableView 中保持删除感到困惑

转载 作者:行者123 更新时间:2023-11-29 00:34:06 25 4
gpt4 key购买 nike

编辑:我已经尝试解决这个问题 8 个小时了,如果有人了解我在使用 UserDefaults 时做错了什么,请告诉我我需要做什么。这让我发疯。

我正在使用 viewDidLoad 中的 setPage() 函数填充一个 TableView (取决于在前一个 TableView 上点击了哪个单元格)

func setPage() {
let pageTitle = self.navigationItem.title
let userDefaults = UserDefaults.standard


let productData = userDefaults.object(forKey: "products") as? [String]
let productImageData = userDefaults.object(forKey: "productImages") as? [String]

ProductController.products = productData!
ProductController.productImages = productImageData!

switch pageTitle! {
case "Apple":
ProductController.products = appleProducts
ProductController.productImages = appleImages
case "Google":
ProductController.products = googleProducts
ProductController.productImages = googleImages
case "Twitter":
ProductController.products = twitterProducts
ProductController.productImages = twitterImages
case "Tesla":
ProductController.products = teslaProducts
ProductController.productImages = teslaImages
default:
ProductController.products = samsungProducts
ProductController.productImages = samsungImages
}

tableView.reloadData()
}

并在 cellForRowAt indexPath 中

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

let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! ProductCell

cell.textLabel?.text = ProductController.products[indexPath.row]
DispatchQueue.main.async {
cell.productLogoView.image = UIImage(named: ProductController.productImages[indexPath.row])!
}
return cell
}

这里是我处理删除单元格的地方

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
{
return true
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
{
if editingStyle == .delete
{
tableView.beginUpdates()
ProductController.products.remove(at: indexPath.row)
ProductController.productImages.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)

let userDefaults = UserDefaults.standard
userDefaults.set(ProductController.products, forKey: "products")
userDefaults.set(ProductController.productImages, forKey: "productImages")

tableView.endUpdates()
}
}

如果我离开页面然后返回,已删除的单元格会再次出现。我意识到这是因为我在 viewDidLoad 中填充了 tableView,我认为使用 UserDefaults 是解决这个问题的方法,但我不确定在这种情况下如何实现它。我已阅读文档并四处寻找解决方案,但在这个特定用例中找不到任何对我有帮助的东西。

如何让已删除的单元格保持删除状态,直到应用重新启动?

初始化数组 - 我有空的产品和产品图片数组,因此 setPage() 检查标题,然后用相应公司的产品和产品图片填充空数组。

    static var products = [String]()
var appleProducts = ["iPad", "iPod", "iPhone"]
var googleProducts = ["Search", "Firebase", "Pixel"]
var twitterProducts = ["Twitter", "Periscope", "Vine"]
var teslaProducts = ["Tesla Model S", "Tesla Model X", "Tesla Powerwall"]
var samsungProducts = ["Samsung Galaxy", "Samsung Note", "Samsung Tab"]

static var productImages = [String]()
var appleImages = ["iPad", "iPod", "iPhone"]
var googleImages = ["GoogleLogo", "Firebase", "Pixel"]
var twitterImages = ["TwitterLogo", "Periscope", "Vine"]
var teslaImages = ["TeslaS", "TeslaX", "TeslaPowerwall"]
var samsungImages = ["SamsungGalaxy", "SamsungNote", "SamsungTab"]

最佳答案

UserDefaults 只是一堆键和值对。因此,您可以为每个产品分配一个 bool 值(“隐藏”):

// get the current product - this depends on how your table is set up
let product = products[indexPath.row]
// set the boolean to true for this product
UserDefaults.set(true, forKey: product)

然后,无论您在何处初始化产品,请添加:

// only include elements that should not be hidden
products = products.filter({ UserDefaults.boolForKey($0) == false })

你也可以存储所有的

关于ios - 对使用 UserDefaults 确保删除的项目在 TableView 中保持删除感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41067251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com