Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在tableViewCell中保存UIButton的状态?_Ios_Swift_Uitableview_Uibutton_Tableviewcell - Fatal编程技术网

Ios 如何在tableViewCell中保存UIButton的状态?

Ios 如何在tableViewCell中保存UIButton的状态?,ios,swift,uitableview,uibutton,tableviewcell,Ios,Swift,Uitableview,Uibutton,Tableviewcell,我现在有一个tableViewCell,上面有一个按钮,按下时会出现一个复选标记。我正在尝试将UIButton的状态保存为NSUserDefaults。还有一个单独的viewController,其单元格中有一个X按钮,该按钮将删除保存在NSUserDefaults中的UIButton状态。我试过这个 但它似乎不适用于tableViewCell。这是我目前的代码: 自定义按钮: class SaveButton: UIButton { // Images let buttonCheck

我现在有一个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)
   }
  }
i删除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()
        }

我想您可以从
awakeFromNib()
cellforrowforinindepath
中尝试一下。
希望这能起作用:)

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

 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)
}

我尝试了这个方法,但当它到达代码行时,我得到了一个“致命错误:在展开可选值时意外地发现了nil”,可能与UITableViewController中使用的函数
removeSavedObject
的位置重复?我在检索NSUserDefaults时遇到问题。我使用了行:saveButton.selected=NSUserDefaults.standardUserDefaults().BoolWorkery(“IsbTncheced”),但我一直收到一个错误:“致命错误:在展开可选值时意外发现了nil”。问题是什么?通过我对代码所做的更改,现在应该可以正常工作了。这是检索NSUserdefaults的过程,问题出在您的
TableViewCell
saveButtonPressed
方法中,您可以将该方法更改为
saveButtonPressed(sender:UIButton){sender.selected=!sender.selected}
由于您已经有了didSet属性观察器,您不需要自己更改图像。此外,由于它表示
boolforky
部分不起作用,这可能是因为在保存对象之前。您可能需要从模拟器中删除应用程序以清除默认值,因为即使它现在可能是bool,但在默认值中,它可能有冲突的值。