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

Posted

技术标签:

【中文标题】使用 indexPath.row 保存收藏按钮状态【英文标题】:Save Favorite button state with indexPath.row 【发布时间】:2017-04-29 14:00:03 【问题描述】:

我为我的 detailViews 制作了一个最喜欢的按钮(我有一个 master-detail 应用程序),它通常为所有单元格/DetailsViews 保存按钮状态...我希望如果我按下 index 的 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】:

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


编辑:

您想存储布尔字典,以便您可以访问每一行的值。我不鼓励您使用 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)

【讨论】:

我该怎么做?你能帮我一个代码sn-p吗? 为每个动作添加了 sn-ps,现在你可以尝试实现它,当你遇到困难时我们可以帮助你 不错!谢谢你。 1 最后一件事,我是否将所有这些都放在按钮的操作中? 不,绝对不是,只有按钮动作中的东西应该是这些favorites[index] = true / false和让userDefaults.set(favorites, forKey: favoritesKey),存储本地副本可能在viewDidLoad中完成,获取值显然应该在创建按钮时发生(你现在在哪里做)。不要忘记将答案标记为正确。 人,对不起,我是个菜鸟,但我无法完成这项工作......另外我收到一个错误消息:Cannot subscript a value of type '[Int : Bool]' with an index of type '(IndexPath).Type' (aka 'IndexPath.Type') 试图更改索引会导致它说未知的东西,例如索引跨度>

以上是关于使用 indexPath.row 保存收藏按钮状态的主要内容,如果未能解决你的问题,请参考以下文章

如何得到自定义UITableViewCell中的按钮所在的cell的indexPath.row

当我按下按钮推送到另一个 ViewController 时,如何知道我的按钮在哪个 indexPath.row 中?

点击单元格中的 UIImageView 时如何获取 indexpath.row?

在 IBAction 中获取 indexPath.row?

仅使用 shouldSelectItemAt indexPath 函数选择特定单元格

在 NSUserDefaults 的表格视图单元格中保存收藏按钮的状态