06 장

UserDefaults

//UserDefault에 데이터 저장하기
 UserDefaults.standard.set("Some data", forKey: "someDataKey")

데이터 저장

데이터 가져오기(읽기)

// UserDefaults로 데이터 저장
let defaults = UserDefaults.standard
defaults.set(25, forKey: "Age")
defaults.set(true, forKey: "UseTouchID")
defaults.set(CGFloat.pi, forKey: "Pi")
// UserDefaults로 데이터 저장
let myDefaults = UserDefaults.standard        
myDefaults.set("JongHyun", forKey: "name")

// UserDefaults로 부터 데이터 읽기              
let savedObject = myDefaults.object(forKey: "name")
if let data = savedObject as? String {
            print(data)
}

// 저장된 데이터의 path 확인        
var path: [AnyObject] = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true) as [AnyObject]
let folder: String = path[0] as! String
print("Your NSUserDefaults are stored in this folder: \(folder)")

//  Copyright © 2017년 DIT Apps. All rights reserved.
//  XCode 8.3.2

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        // 데이터 저장
        let userName = UserDefaults.standard
        userName.set("jhkim", forKey: "name")

        // 데이터 읽기
        // forced Type casting
        //let userName = defaults.object(forKey: "name") as! String

        // optional Type casting
        if let myName = userName.object(forKey: "name") as? String {
            print(myName)
        } else {
            print("형변환에서 nil 발생!")
        }

        //////
        // 데이터 저장
        let passwd = UserDefaults.standard
        passwd.set(12345, forKey: "Passwd")

        // 데이터 읽기
        if let myPasswd = passwd.object(forKey: "Passwd") as? Int {
            print(myPasswd)
        } else {
            print("nil 발생!")
        }

         // 배열 값 다루기
        let arr = [1, 2, 3, 4, 5]
        let arrayObject = UserDefaults.standard
        arrayObject.set(arr, forKey: "aryTest")

        // Any 형은 형변환이 필요하지 않움
        if let myArray = arrayObject.array(forKey: "aryTest") {
            print(myArray)
        }
    }
}

output

jhkim

12345

[1, 2, 3, 4, 5]




//  ViewController.swift
//  NSUserDefaults Test

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet var firstName: UITextField!
    @IBOutlet var lastName: UITextField!
    @IBOutlet var clearButton: UIButton!
    @IBAction func saveBtnClick(sender: AnyObject) {

        let defaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(firstName.text, forKey: "firstName")
        defaults.setObject(lastName.text, forKey: "lastName")

        print("firstName = \(firstName.text), lastName = \(lastName.text)") 
    }

    func loadDefaults() {
        let defaults = NSUserDefaults.standardUserDefaults()

        // forced downcasting vs. conditional downcasting
        firstName.text = defaults.objectForKey("firstName") as? String
        lastName.text = defaults.objectForKey("lastName") as? String

        print("fn = \(firstName.text)  ln = \(lastName.text)")
    }

    @IBAction func clearBtnClick(sender: AnyObject) {
        if firstName.text == "" {
            loadDefaults()
            clearButton.setTitle("Clear", forState: .Normal)
        }
        else {
            firstName.text = ""
            lastName.text = ""
            clearButton.setTitle("Load", forState: .Normal)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        firstName.delegate = self
        lastName.delegate = self
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        view.endEditing(true)
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        firstName.resignFirstResponder()
        lastName.resignFirstResponder()
        return true
    } 
}

UIViewController Life Cycle


참고 : https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson4.html

메모장(To-Do-List) 만들기

//  FirstViewController.swift
//  To Do List

import UIKit
var toDoList = [String]()

class FirstViewController: UIViewController, UITableViewDelegate {

    @IBOutlet var toDoListTable: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 앱 구동 초기 기존에 NSUserDefaults에 저장된 데이터를 불러와 toDoList 배열에 저장함
        if NSUserDefaults.standardUserDefaults().objectForKey("toDoList") != nil {

            toDoList = NSUserDefaults.standardUserDefaults().objectForKey("toDoList") as! [String]
        }
    }

    // 테이블뷰 생성
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("toDoList count = \(toDoList.count)")
        return toDoList.count
    }

    // toDoList 배열에 있는 데이터를 테이블뷰 cell에 넣음
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
        cell.textLabel?.text = toDoList[indexPath.row]
        return cell
    }

    // cell을 삭제
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

        if editingStyle == UITableViewCellEditingStyle.Delete {
            toDoList.removeAtIndex(indexPath.row)

            // NSUserDefault에 삭제로 인해 변경된 toDoList 데이터를 저장함
            NSUserDefaults.standardUserDefaults().setObject(toDoList, forKey: "toDoList")

            // 테이블의 데이터를 새로 업데이트 함
            toDoListTable.reloadData()
        }
    }

    // view가 view 계층구조에 추가 됨을 viewContoller에 notify 함
    override func viewDidAppear(animated: Bool) {
        // 테이블의 데이터를 새로 업데이트 함
        toDoListTable.reloadData() 
    }
}

//  SecondViewController.swift
//  To Do List
import UIKit

class SecondViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet var item: UITextField!

    @IBAction func addItem(sender: AnyObject) {
        toDoList.append(item.text!)
        item.text = ""
        NSUserDefaults.standardUserDefaults().setObject(toDoList, forKey: "toDoList")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.item.delegate = self
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        //self.view.endEditing(traitCollection)
        self.view.endEditing(true)
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        item.resignFirstResponder()
        return true
    }
}

[코딩 문제 13] 메모장 기능 추가하기 mini 프로젝트

제6장 메모장(To-Do-List) 앱 소스를 이용하여 창의적이고 실용적인 다양한 기능을 추가하시오.

  • 예3) Image 선택, DatePicker 사용


예3) 기타 등등 메모장 앱을 편리하게 하는 다양한 기능 추가


기말 프로젝트 용 소스 다운로드

  1. 수업 소스
  2. 교재 소스
  3. Github 소스(Jake Lin)
  4. Custom 객체를 이용한 소스(coding by prof. Kim)
    • custom 객체(Object: dataModel.swift)를 UserDefaults에 저장하거나 가져올때 non-property-object 오류가 발생한다. 이문제를 해결하기 위한 좋은 방법은 객체를 encode/ decode해야 한다. 다음의 블로그는 이를 해결하기 위한 방법을 알려 준다.
    • 참고 : 블로그 보기 링크

Core Data 를 이용한 To Do List 만들기

http://swiftdeveloperblog.com/building-list-swift-coredata/

results matching ""

    No results matching ""