使用 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?