概要
userDefaultsに保存した値をTableViewで表示する機能を独学で実装してみました。
storyBoadとラベル配置の説明は省略します。
①userDefaultsに保存するための空配列を作成する
ViewController.swift
var saveArray :[String] = []
②textFieldの入力値やpickerで選択した値を配列に追加する
ViewController.swift
var textFieldValue :String = ""
textFieldString = textField.text!
saveArray.append("\(textFieldValue)")
③userDefaultsに保存
ViewController.swift
UserDefaults.standard.set(saveArray, forKey: "1")
④userDefaultsから取り出した後にしまう空配列を作成する
ViewController.swift
var memoryArray :[String] = []
var memoryArrayReversed :[String] = [] //並び替え用の配列
⑤userDefaultsから値を取り出す
MemoroyViewController.swift
func readFromUserDefaults(){
guard let savedArray = UserDefaults.standard.array(forKey: "1") as? [String] else {
print("値がありません")
return}
memoryArray = savedArray
}
配列が空の可能性があるのでオプショナルバインディングで値を取り出します。
⑥新しいものが上に来る様にしたいので、昇順に配列をソートする
MemoryViewController.swift
func sort(){
memoryArrayReversed = memoryArray.reversed()
}
⑦TableViewで表示
MemoryViewController.swift
//tableViewの設定
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.memoryArrayReversed.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: "myCell")
cell.textLabel?.text = self.memoryArrayReversed[indexPath.row]
return cell
}
ViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
readFromUserDefaults()
sort()
//通知受信
NotificationCenter.default.addObserver(self, selector: #selector(arrayClear(notification:)), name: .notifyName, object: nil)
}
⑧userDefaultに保存した値を全削除する機能を追加(アラート付き)
MemoryViewController
//メモを削除する機能(ユーザーデフォルトの中身を全て削除)
func killAllUserDefaults (){
UserDefaults.standard.removeObject(forKey: "1")
}
//メモを削除するボタンの実装(アラート付き)
@IBAction func killUserDefaults(_ sender: Any) {
let alert: UIAlertController = UIAlertController(title: "Alert!", message: "メモを全て削除します", preferredStyle: UIAlertController.Style.alert)
//OKボタンの実装
let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler:{
// OKボタンが押された時の処理
(action: UIAlertAction!) -> Void in
print("OK")
self.killAllUserDefaults()
self.tableView.reloadData() //!!なぜかリロードしない
self.dismiss(animated: true, completion: nil)
//通知送信
NotificationCenter.default.post(name: .notifyName, object: nil)
})
//キャンセルボタンの実装
let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler:{
// キャンセルボタンが押された時の処理
(action: UIAlertAction!) -> Void in
print("Cancel")
})
alert.addAction(cancelAction)
alert.addAction(defaultAction)
//Alertを表示
present(alert, animated: true, completion: nil)
}
ViewController.swift
//通知名前空間の拡張
extension Notification.Name {
static let notifyName = Notification.Name("notifyName")
}
//配列初期化メソッド(notificationCenter通知用)
@objc func arrayClear(notification :NSNotification){
saveArray = []
}