在Collection View Cell

时间:2016-12-01 21:49:10

标签: ios swift nsuserdefaults xcode8 collectionview

我有一个应用程序,它使用集合视图来获取数据数组。

我已经通过故事板向集合视图单元格添加了一个按钮。当用户点击按钮时,其所选状态会发生变化。哪个工作正常。

然后我尝试使用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

任何帮助......已经在这里吮吸了很长时间..无法找到解决这种情况的方法......请...

1 个答案:

答案 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
}