如何在uitableViewCell中保存UIButton的状态?

Posted

技术标签:

【中文标题】如何在uitableViewCell中保存UIButton的状态?【英文标题】:How to save state of UIButton in a tableViewCell? 【发布时间】:2016-04-17 18:37:02 【问题描述】:

我目前有一个带有一个按钮的 tableViewCell,当按下它时会出现一个复选标记。我正在尝试将 UIButton 的状态保存到 NSUserDefaults。还有一个单独的 viewController 带有一个带有 X 按钮的单元格,它将删除保存在 NSUserDefaults 中的 UIButton 状态。我试过这个 但它似乎不适用于 tableViewCell。这是我当前的代码:

自定义按钮:

class SaveButton: UIButton 

  // Images
  let buttonChecked = UIImage(named: "save_icon_greenCheck")
  let buttonUnChecked = UIImage(named: "save_icon_white")


  //Bool Property
  override var selected: Bool
    didSet
      if selected 
        self.setImage(buttonChecked, forState: UIControlState.Normal)
      else
        self.setImage(buttonUnChecked, forState: UIControlState.Normal)
      
      NSUserDefaults.standardUserDefaults().setObject(selected, forKey: "isBtnChecked")
     // NSUserDefaults.standardUserDefaults().synchronize()
    
  

  override init(frame: CGRect)
    super.init(frame:frame)
    self.layer.masksToBounds = true
    self.setImage(buttonUnChecked, forState: UIControlState.Normal)

    self.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
  

  required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)!
  

  func buttonClicked(sender: UIButton) 
    self.selected = !self.selected
  

TableViewCell:

class TvShowCell: UITableViewCell 

  @IBOutlet var MainPosterImage: UIImageView!
  @IBOutlet var MainTitleLabel: UILabel!
  @IBOutlet var imageWrapper: UIView!

  @IBOutlet weak var saveButton: SaveButton!

  override func awakeFromNib() 
  saveButton.selected = NSUserDefaults.standardUserDefaults().boolForKey("isBtnChecked") // here we obtain the last state of the button
  

  @IBAction func saveButtonPressed(sender: AnyObject) 
      sender.setImage(UIImage(named: "save_icon_greenCheck"), forState: UIControlState.Normal)
   
  

IBAction 移除 UIButtonState:

    @IBAction func removeSavedObject(sender: AnyObject) 
        let searchTermsData = myDefaults.objectForKey(SAVED_SHOWS_KEY) as? NSData
        let searchTermsArray = NSKeyedUnarchiver.unarchiveObjectWithData(searchTermsData!) as? [TvShowInfo]
         favoriteShowsArray = searchTermsArray!
          let location: CGPoint = sender.convertPoint(CGPointZero, toView: self.favoritesTableView)
          let indexPath: NSIndexPath = self.favoritesTableView.indexPathForRowAtPoint(location)!
          showToRemove = favoriteShowsArray[indexPath.row]

 //save UIButtonState here
      let save = SaveButton()
      save.selected = false
      myDefaults.setObject(save, forKey: "isBtnChecked")

  let savedData = NSKeyedArchiver.archivedDataWithRootObject(favoriteShowsArray)
          myDefaults.setObject(savedData, forKey: SAVED_SHOWS_KEY)
          myDefaults.synchronize()
          favoritesTableView.reloadData()
        

【问题讨论】:

How to show custom view in UITableviewCell when button pressed?的可能重复 UITableViewController中removeSavedObject 的函数在哪里使用? 【参考方案1】:

为什么不保存按钮状态而不是尝试保存整个按钮?后者不起作用,因为当您尝试将整个对象保存到 NSUSerDefaults 时,您需要将其存档。相反,您可以将选定状态保存为布尔值,因为它是默认类型,所以不需要存档。 所以当按钮被选中时,只需将选中状态保存为布尔值而不是对象。

 override var selected: Bool
didSet
  if selected 
    self.setImage(buttonChecked, forState: UIControlState.Normal)
  else
    self.setImage(buttonUnChecked, forState: UIControlState.Normal)
  
  NSUserDefaults.standardUserDefaults().setBool(selected, forKey: "isBtnChecked")


然后在您的@IBAction 中删除按钮的状态,而不是创建按钮对象,将其设置为未选中,然后保存,只需这样做:

NSUserDefaults.standardUserDefaults.setBool(false, forKey: "isBtnChecked")

由于您在情节提要中创建了单元格,因此您应该像这样进行初始化:

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    saveButton.selected = NSUserDefaults.standardUserDefaults().boolForKey("isBtnChecked")


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)

【讨论】:

我在检索 NSUserDefaults 时遇到问题。我使用这条线: saveButton.selected = NSUserDefaults.standardUserDefaults().boolForKey("isBtnChecked") 但我不断收到错误消息:“致命错误:在展开可选值时意外发现 nil”。 有什么问题?随着我对您的代码所做的更改,现在应该可以正常工作了 它是检索问题所在的 NSUserdefaults 在你的TableViewCellsaveButtonPressed方法中怎么样,你把方法改成saveButtonPressed(sender: UIButton) sender.selected = !sender.selected 因为你已经有了你的didSet属性观察者,你不需要自己改变图像。 另外,因为它说boolForKey 部分不起作用,这可能是因为在您保存对象之前。您可能需要从模拟器中删除您的应用程序以清除您的默认值,因为即使它现在可能是布尔值,但在默认值中它可能具有冲突的值。【参考方案2】:

我认为您在 awakeFromNib() 中所做的事情可以在 cellforrowforinindexpath 中尝试。 希望这会奏效:)

【讨论】:

我试过了,我得到一个“致命错误:在展开可选值时意外发现 nil”,一旦它到达那行代码

以上是关于如何在uitableViewCell中保存UIButton的状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在uitableViewCell中保存UIButton的状态?

如何在 Swift 3 中保存 UITableViewCell 附件复选标记的状态

如何将 UITableViewCell 内的 UICollectionViewCell 的选定索引路径保存到数组中?

在 Swift 中保存 UITableViewCell 复选标记选择

保存 UITableViewCells 的顺序

关闭视图控制器时在 UITableViewCell 中保存 UICollectionView 的选定状态