はじめに
userDefaultsを使って、tableViewに表示されている記事を、保存する機能を実装する機会があったので、備忘録として載せます。
大まかな流れ
1.tableViewを表示(お気に入りボタン付き)
2.お気に入りボタンタップ時のセル番目を獲得。
2-2.タップしたセルが持つDicを、空宣言した配列に納入
2-3.その配列をuserDefaultsに、セットする。
3.別のViewで、userDefaultsから取り出し、tableViewで表示。
1.tableViewを表示(お気に入りボタン付き)
PropertyList.plist
を作成し、tableViewに表示させます。
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