对使用UserDefaults确保在表格视图中保留删除的项目感到困惑

时间:2016-12-09 19:05:13

标签: ios uitableview swift3

编辑:我一直试图解决这个问题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是解决这个问题的方法,但我不确定如何在这种情况下实现它。我已经阅读了文档并四处寻找解决方案,但在这个特定的用例中我找不到任何可以帮助我的东西。

在重新启动应用程序之前,如何让已删除的单元格保持删除状态?

初始化数组 - 我有空数组的产品和productImages,因此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"]

1 个答案:

答案 0 :(得分:1)

UserDefaults只是一堆键和值。因此,您可以为每个产品分配一个布尔值("隐藏"):

// 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 })

您还可以存储所有