使用indexPath.row保存收藏夹按钮状态

时间:2017-04-29 14:00:04

标签: ios swift button favorites

我已经为我的detailViews制作了一个最喜欢的按钮(我有一个主 - 详细应用程序)并且它通常为所有单元格/ DetailsViews保存按钮状态...我想如果按下索引的3单元格它将保存按钮状态只有那里,如果我转到索引4,它将单独保存到该行,并不会将相同的状态保存到所有单元格。

收藏夹按钮:

//create a new button
        let Favoritebutton: UIButton = UIButton(type: UIButtonType.custom)
        //set image for button
        Favoritebutton.setImage(UIImage(named: "EmptyHeart.png"), for: .normal)
        Favoritebutton.setImage(UIImage(named: "FilledHeart.png"), for: .selected)
        //add function for button
        Favoritebutton.addTarget(self, action: #selector(self.button), for: .touchUpInside)
        //set frame
        Favoritebutton.frame = CGRect(x:0,y: 0,width: 35,height: 35)

        Favoritebutton.isSelected = UserDefaults.standard.bool(forKey: "isSaved")

        let barButton = UIBarButtonItem(customView: Favoritebutton)
        //assign button to navigationbar

        self.navigationItem.rightBarButtonItem = barButton

func button(sender: UIButton) {

        audioPlayer.play()

        let newValue = !sender.isSelected
        sender.isSelected = newValue
        UserDefaults.standard.set(newValue, forKey: "isSaved")

        let tabItem = self.tabBarController?.tabBar.items![3]
        sel_val = tabItem?.badgeValue
        if(sel_val == nil){
            sel_val = "0"
        }
        let sel_num  = Int(sel_val!)

        let fav: NSMutableArray = []
        fav.add(barImage)
        fav.add(barName)
        fav.add(streetName)
        if sender.isSelected {
            tabItem!.badgeValue = String(format: "%d", sel_num! + 1)
            favorite.add(fav)
        } else {
            tabItem!.badgeValue = String(format: "%d", sel_num! - 1)
            favorite.remove(fav)
        }
    }

如何像我想要的那样单独为每个indexPath设置按钮保存状态?

这将帮助我完成我的收藏夹功能,因此您的帮助将非常受欢迎!

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

你想要的是存储数组或字典,取决于具体情况。以下是如何存储数组How to save NSMutablearray in NSUserDefaults的示例。我建议在应用程序启动时从默认值中获取值并将其分配给值,因此您有一个本地副本。每次更改后,或者至少在离开应用程序时,不要忘记将数组保存回默认值。

编辑:

您希望存储bool的Dictionary,以便您可以访问每一行的值。我不鼓励你使用indexPath,而应该使用一个对于行唯一的标识符。

这些将用作您应用的本地存储空间

let favoritesKey = "favorites"
var favorites: [Int: Bool] = [:]

这是您获取已保存词典的方式:

favorites = userDefaults.object(forKey: favoritesKey) as? [Int : Bool] ?? [:]

这是您更改价值的方式:

favorites[index] = true / false

这是您获取价值的方式:

let value = favorites[index]

这就是你保存价值的方式:

let userDefaults = UserDefaults.standard
userDefaults.set(favorites, forKey: favoritesKey)