LoginSignup
8
9

More than 5 years have passed since last update.

UserDefaultsで画像をローカルに保存する

Posted at

はじめに

投稿用の画像を下書きとしてUserDefaultsに保存した時のメモです。

主に使う変数

ViewController.swift
   let defaults = UserDefaults.standard
   var saveArray: Array! = [NSData]()
   var image: UIImage!

ViewControllerでの記述

まずはimageをNSData型にキャストして配列としてUserDefaultsに保存する。

ViewController.swift
 func sendSaveImage() {
        //NSData型にキャスト
        let data = image.pngData() as NSData?
        if let imageData = data {
            saveArray.append(imageData)

            defaults.set(saveArray, forKey: "saveImage")
            defaults.synchronize()
        }
    }

保存したデータを取得する。

ViewController.swift
func defaultsArray() {
        //UserDefaultsの中身が空でないことを確認
        if defaults.object(forKey: "saveImage") != nil {
            let objects = defaults.object(forKey: "saveImage") as? NSArray
            //配列としてUserDefaultsに保存した時の値と処理後の値が変わってしまうのでremoveAll()
            saveArray.removeAll()
            for data in objects! {
                saveArray.append(data as! NSData)
            }
        }
        tableView.reloadData()
    }

配列からtableViewに反映する。

ViewController.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell

        //data型にキャストしてUIImageとして取り出す
        cell.cellImageView.image = UIImage(data: saveArray[indexPath.row] as Data)
        cell.cellImageView.frame = CGRect(x: 0, y: 1, width: cell.bounds.size.height - 2, height: cell.bounds.size.height - 2)
        cell.cellImageView.contentMode = .scaleAspectFill
        cell.cellImageView.clipsToBounds = true

        return cell
    }

結果

実行後の結果はこんな感じです。

IMG_8497.jpg

最後に

cellを削除するときはとりあえずこんな感じで行なっています。

ViewController.swift
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        let deleteButton: UITableViewRowAction = UITableViewRowAction(style: .normal, title: "削除", handler: {(action, index) -> Void in
            //指定したcellを削除した状態でUserDefaultsをリセットして保存し直す
            saveArray.remove(at: indexPath.row)
            defaults.removeObject(forKey: "saveImage")
            defaults.set(saveArray, forKey: "saveImage")
            defaults.synchronize()
            tableView.deleteRows(at: [indexPath], with: .fade)
        })
        deleteButton.backgroundColor = .red

        return [deleteButton]

    }

終わり。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9