[swift3.0]UserDefaultsを使って、tableviewで表示されるセルの内容を保存する機能を作る。

#はじめに


userDefaultsを使って、tableViewに表示されている記事を、保存する機能を実装する機会があったので、備忘録として載せます。


![2017-01-24 9.14.41.png](https://qiita-image-store.s3.amazonaws.com/0/150745/4fc1854c-ff34-1848-1941-5cf4ecdfc327.png)

##大まかな流れ


1.tableViewを表示(お気に入りボタン付き)
2.お気に入りボタンタップ時のセル番目を獲得。
 2-2.タップしたセルが持つDicを、空宣言した配列に納入
 2-3.その配列をuserDefaultsに、セットする。
3.別のViewで、userDefaultsから取り出し、tableViewで表示。



#1.tableViewを表示(お気に入りボタン付き)

`PropertyList.plist` を作成し、tableViewに表示させます。
![2017-01-24 7.40.14.png](https://qiita-image-store.s3.amazonaws.com/0/150745/53080069-7ed2-44a1-dd96-08df5f1ad250.png)




```


class TableViewController: UIViewController {

    @IBOutlet weak var TableView: UITableView!
    
    let ud : UserDefaults = UserDefaults.standard
    var favoriteListArr :[[String : String]]=[[:]]
    
    var plistArr = [Dictionary<String, String>]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let path = Bundle.main.path(forResource: "PropertyList", ofType: "plist")
        plistArr = NSArray(contentsOfFile: path!) as! [Dictionary<String, String>]
        
        
    }
}

extension TableViewController: UITableViewDataSource , UITableViewDelegate {
    
    //行数指定
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return plistArr.count
    }
    
    
    //表示内容
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
        cell.Title.text = plistArr[indexPath.row]["title"]
        return cell
    }
    
}


```

#2.お気に入りボタンタップ時のセル番目を獲得。


```


    //最上部の画像に登場する星型の黄色ボタン
    @IBAction func favoriteYellowBtn(_ sender: Any) {
        
        let btn = sender as! UIButton
        //タップした星型の黄色ボタンの行数とセルの行数が一致させる
        let cell = btn.superview?.superview as! TableViewCell

        //星型ボタンタップ時のセル番目を獲得
        let tappedRow = TableView.indexPath(for: cell)?.row
        
        let tableViewSelected = plistArr[tappedRow!]

        //タップしたセルが持つ辞書型を、空宣言した配列に格納
        favoriteListArr.append(tableViewSelected)
        //その配列をuserDefaultsに、セットする。
        ud.set(favoriteListArr as! Array, forKey: "favoriteListArr")
        ud.synchronize()

    }
```

#3.別Viewで、userDefaultsから取り出し、tableViewで表示。

```


import UIKit

class FavoriteTableViewController: UIViewController {
    
    let ud : UserDefaults = UserDefaults.standard
    var favoriteListArr : Array<[String : Any]> = []


    override func viewDidLoad() {
        super.viewDidLoad()
        if var favorites = ud.array(forKey: "favoriteListArr") as! Array?{
            favorites.removeFirst()
            favoriteListArr = favorites as! Array<[String : Any]>
        }
    }


extension FavoriteTableViewController : UITableViewDataSource, UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return favoriteListArr.count
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! UITableViewCell
        var favoriteListArrText = (self.favoriteListArr[indexPath.row] as! [String : String])["title"]
        cell.textLabel?.text = favoriteListArrText
        return cell
    }
}


```

#おわりに


Xcodeさんから、
`type any has no subscript members`
とよく怒られました。型宣言はきっちりやります。m(__)m 

もっと良い書き方あるよ！などございましたら、ご指摘お願い致しますm(__)m