我有一个应用程序,它使用集合视图来获取数据数组。
我已经通过故事板向集合视图单元格添加了一个按钮。当用户点击按钮时,其所选状态会发生变化。哪个工作正常。
然后我尝试使用NSUserDefaults保存并检索关键字“isSelected”的UIButton的bool值。
这是我如何更改bool值并使用NSUserDefault保存。
@IBAction func likeBtn(_ sender: UIButton) {
if sender.isSelected == false {
sender.isSelected = true
let defaults = UserDefaults.standard
defaults.set(true, forKey: "isSelected")
}
else {
sender.isSelected = false
let defaults = UserDefaults.standard
defaults.set(false, forKey: "isSelected")
}
}
在我的cellForItemAt indexPath中,我尝试获取UIButton的bool值。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = newsfeedColView.dequeueReusableCell(withReuseIdentifier: "NewsFeed", for: indexPath) as! NewsFeedCollectionViewCell
cell.likeBtn.addTarget(self, action: #selector(NewsFeedViewController.likeBtn(_:)), for: UIControlEvents.touchUpInside)
var defaults = UserDefaults.standard
var state = defaults.bool(forKey: "isSelected")
cell.likeBtn.isSelected = state
return cell
}
一切正常,直到我使用应用程序,但当我退出应用程序并再次打开时,保存的bool值被分配给每个单元格中的UIButton而不是仅仅是我之前使用应用程序选择的单元格。< / p>
我认为我必须在使用NSUserDefault保存时指定索引路径。但无法弄清楚如何我是swift和Xcode的新手。如何继续前进的任何帮助。
Screen Shot of the viewcontroller
任何帮助......已经在这里吮吸了很长时间..无法找到解决这种情况的方法......请...
答案 0 :(得分:0)
由于您只是为所有tableView的行使用一个值,当您“选择”为真时,对于所有现在正在发生的事情都是如此。 您确实需要数据库来保存每行的“选定”状态。 但是如果这只是一个原型,你可以使用UserDefaults作为快速数据库。为此,您需要为每个'isSelected'行使用不同的键,并使用button标记作为键。
@IBAction func likeBtn(_ sender: UIButton)
{
if sender.isSelected == false {
sender.isSelected = true
let defaults = UserDefaults.standard
defaults.set(true, forKey: "isSelected\(sender.tag)")
}
else {
sender.isSelected = false
let defaults = UserDefaults.standard
defaults.set(false, forKey: "isSelected\(sender.tag)")
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = newsfeedColView.dequeueReusableCell(withReuseIdentifier: "NewsFeed", for: indexPath) as! NewsFeedCollectionViewCell
cell.likeBtn.addTarget(self, action: #selector(NewsFeedViewController.likeBtn(_:)), for: UIControlEvents.touchUpInside)
let tag = indexPath.row
cell.likeBtn.tag = tag
var defaults = UserDefaults.standard
var state = defaults.bool(forKey: "isSelected\(tag)")
cell.likeBtn.isSelected = state
return cell
}