2016-04-17 7 views
1

現在、tableViewCellにボタンがあり、このボタンを押すとチェックマークが表示されます。私はNSUserDefaultsにUIButtonの状態を保存しようとしています。また、NSUserDefaultsに保存されたUIButton状態を削除するXボタンを持つセルを持つ別のviewControllerがあります。私はこれを試しました しかし、それは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-uitableview-cell-when-button-pressed) –

+0

UITableViewControllerの 'removeSavedObject'関数はどこにありますか? –

答えて

0

私はあなたがawakeFromNib()試してから何をするかと思いますそれはcellforrowforinindexpathです。 これがうまくいくことを祈っています:)

+0

私はそれを試しました、私は "致命的なエラーが発生しました:予期せず、オプションの値をアンラップしている間にnilが見つかりました"コード行にヒットしたら – SwiftyJD

1

ボタン全体を保存するのではなく、ボタンの状態を保存してみませんか? NSUSerDefaultsにオブジェクト全体を保存しようとすると、アーカイブする必要があるため、後者は機能しません。その代わりに、選択した状態をboolとして保存することができます。これは、デフォルトのタイプであるため、アーカイブする必要はありません。 ボタンが選択されているときは、選択した状態をオブジェクトではなくブールとして保存するだけです。あなたの@IBAction

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

そして代わりに、ボタンオブジェクトをクレート選択されていないとして、それを設定し、それを保存するので、ボタンの状態を除去するため、ちょうどこの操作を行います。

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")しかし、私はエラーを受け取り続ける: "致命的なエラー:予期せず見つかったオプション値をアンラッピングしながらnil"。 – SwiftyJD

+0

何が問題なのですか? – pbush25

+0

問題があるNSUserdefaultsを取得しています – SwiftyJD

関連する問題