【问题标题】:Save Favorite button state with indexPath.row使用 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 设置按钮保存状态?

这将帮助我完成我最喜欢的功能,因此非常感谢您的帮助!

感谢您的帮助!

【问题讨论】:

    标签: ios swift button favorites


    【解决方案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') 试图更改索引会导致它说未知的东西,例如索引跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多