2016-04-17 4 views
1

В настоящее время у меня есть tableViewCell с кнопкой на нем, который при нажатии появляется галочка. Я пытаюсь сохранить состояние UIButton в NSUserDefaults. Существует также отдельный viewController с ячейкой, у которой есть кнопка X, которая удалит состояние UIButton, сохраненное в NSUserDefaults. Я пробовал это , но он не работал с tableViewCell. Вот мой текущий код:Как сохранить состояние 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() 
     } 
+0

Возможный дубликат [Как показать настраиваемое представление в UITableViewCell, когда нажата кнопка?] (http://stackoverflow.com/questio ns/36531010/how-to-show-custom-view-in-uitableviewcell-при нажатии кнопки) –

+0

Где используется функция 'removeSavedObject' в UITableViewController? –

ответ

0

Я думаю, что вы делаете с awakeFromNib() попытки это в cellforrowforinindexpath. надеюсь, что это сработает :)

+0

Я пробовал это, я получаю «фатальную ошибку: неожиданно нашел нуль при распаковке необязательного значения» после того, как она попала в эту строку кода – SwiftyJD

1

Почему бы вам просто не сохранить состояние кнопки, а не пытаться сохранить целую кнопку? Последнее не работает, потому что, когда вы пытаетесь сохранить целый объект в NSUSerDefaults, вам необходимо его заархивировать. Вместо этого вы можете просто сохранить выбранное состояние как 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) 
} 
+0

У меня возникла проблема с извлечением NSUserDefaults. Я использую строку: saveButton.selected = NSUserDefaults.standardUserDefaults(). BoolForKey («isBtnChecked»), но я все время получаю сообщение об ошибке: «фатальная ошибка: неожиданно обнаружена нуль при развертывании необязательного значения». – SwiftyJD

+0

В чем проблема? С изменениями, внесенными мной в ваш код, это должно сработать нормально – pbush25

+0

Его извлечение NSUserdefaults, где находится проблема – SwiftyJD

Смежные вопросы