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
메모장(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) 앱 소스를 이용하여 창의적이고 실용적인 다양한 기능을 추가하시오.
- 예1)
NSDate
를 이용한 날짜 추가하기 기능 - 참고)
NSDateForamtter, NSDate
https://iosdevcenters.blogspot.com/2016/03/nsdateformatter-in-swift.html
- 예3) Image 선택, DatePicker 사용
예4) 메모장에 이모티콘 선택하여 추가하기 기능
참고 앱) SQLLite(CoreData)를 사용하여 데이터 저장
https://itunes.apple.com/kr/app/gibun-ilgijang/id1065419380?mt=8
예3) 기타 등등 메모장 앱을 편리하게 하는 다양한 기능 추가
기말 프로젝트 용 소스 다운로드
수업 소스
교재 소스
Github 소스(Jake Lin)
Custom 객체를 이용한 소스(coding by prof. Kim)
- custom 객체(Object: dataModel.swift)를 UserDefaults에 저장하거나 가져올때 non-property-object 오류가 발생한다. 이문제를 해결하기 위한 좋은 방법은 객체를 encode/ decode해야 한다. 다음의 블로그는 이를 해결하기 위한 방법을 알려 준다.
- 참고 : 블로그 보기 링크