在本教程中,我們將研究如何讀寫(xiě)NSUserDefaults的。眾所周知送浊,這個(gè)類(lèi)使用處理用戶信息的,對(duì)用戶信息進(jìn)行設(shè)置和存取的丘跌。
以下是各種不同類(lèi)型袭景,我們可以在存儲(chǔ)NSUserDefaults的。正如你所看到的闭树,我們可以存儲(chǔ)在那里幾乎任何東西耸棒,但是,這并不意味著它是一個(gè)好主意报辱。不要用它來(lái)存儲(chǔ)密碼和這樣的敏感信息与殃。想象一下,這個(gè)文件是一個(gè)開(kāi)放的服務(wù)器上的任何腳本小子會(huì)攻入的碍现。敏感的東西進(jìn)入鑰匙串幅疼,或加密的數(shù)據(jù)庫(kù)。我們也不想用這個(gè)來(lái)存儲(chǔ)大文件昼接。這將會(huì)是很慢爽篷,并有用于更好的存儲(chǔ)解決方案。
首先慢睡,我們會(huì)得到一個(gè)參考標(biāo)準(zhǔn)用戶的默認(rèn)值逐工。讓我們先從最喜歡的啤酒铡溪。這個(gè)例子是最直接的。我們只需要調(diào)用與我們要存儲(chǔ)字符串設(shè)定的setObject泪喊,我們希望字符串鍵使用后得到它棕硫。
我們還希望存儲(chǔ)的圖像。我們將使用一個(gè)的UIImagePickerController獲取圖像窘俺。要保存它饲帅,我們需要得到的圖像數(shù)據(jù)复凳。我們會(huì)得到所選圖像的JPEG表示瘤泪,并存儲(chǔ)。
我們將使用的方法objectForKey育八。我們得到的是什么NSData的对途,就像是我們存儲(chǔ)。我們將初始化與數(shù)據(jù)一個(gè)UIImage髓棋,然后在一個(gè)UIImageView顯示它实檀。所以這是圖像和縮小。
我們想要做的最后一件事是保存在用戶修改默認(rèn)的時(shí)間戳按声。日期是的NSDate對(duì)象膳犹,以便我們使用用于圖像相同的objectForKey方法。這一步起碼是簡(jiǎn)單的签则,因?yàn)槲覀儾恍枰4嬷白鋈魏翁厥獾膶?duì)象须床。 NSUserDefaults得知道這是一個(gè)日期。
進(jìn)行coding:
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate {
@IBOutlet weak var profileImage: UIImageView!
@IBOutlet weak var favoriteBeerEdit: UITextField!
@IBOutlet weak var lastUpdateText: UILabel!
// 設(shè)置常量key值
static let favoriteBeer = "FAVORITE_BEER"
static let lastUpdate = "LAST_UPDATE"
static let profileImage = "PROFILE_IMAGE"
override func viewDidLoad() {
super.viewDidLoad()
// 清除保存的userdefaults
//let appDomain = NSBundle.mainBundle().bundleIdentifier!
//NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
//添加手勢(shì)
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
view.addGestureRecognizer(tap)
// 從NSUSerDefaults更新UI
getUserPreferences()
}
// MARK: -保存和獲得 NSUserDefaults
// 從相冊(cè)取出一張圖片
// 給出訪問(wèn)權(quán)限
@IBAction func saveProfilePic(sender: UIButton) {
print("Save Profile")
let imagePicker = UIImagePickerController()
//判斷選擇的類(lèi)型渐裂,設(shè)置代理豺旬,保存到相冊(cè)
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum){
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum;
imagePicker.allowsEditing = false
//關(guān)閉
self.presentViewController(imagePicker, animated: true, completion: nil)
} else {
print("沒(méi)有獲取圖片")
}
}
// 將beers設(shè)置給NSUserDefaluts
@IBAction func saveBeer(sender: UIButton) {
if (favoriteBeerEdit.text!.characters.count > 0) {
let prefs = NSUserDefaults.standardUserDefaults()
prefs.setObject(favoriteBeerEdit.text, forKey: ViewController.favoriteBeer)
saveTimestamp()
}
dismissKeyboard()
}
// 將選擇的圖片保存到NSUserDefaluts
func saveSelectedImage(image : UIImage) {
profileImage.image = image
// 保存圖片到NSUserDefaults
let prefs = NSUserDefaults.standardUserDefaults()
let imageData = UIImageJPEGRepresentation(image, 100)
prefs.setObject(imageData, forKey: ViewController.profileImage)
saveTimestamp()
}
// 當(dāng)用戶改變timestamp的時(shí)候保存timestamp到NSUserDefaults
func saveTimestamp() {
let prefs = NSUserDefaults.standardUserDefaults()
let timestamp = NSDate()
prefs.setObject(timestamp, forKey: ViewController.lastUpdate)
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = .MediumStyle
lastUpdateText.text = "Last Update:" + dateFormatter.stringFromDate(timestamp)
}
// 更新已經(jīng)保存到NSUserDefaults里面的值
func getUserPreferences() {
let prefs = NSUserDefaults.standardUserDefaults()
// 獲得beer
if let beer = prefs.stringForKey(ViewController.favoriteBeer) {
favoriteBeerEdit.text = beer
}
// 獲得 image
if let imageData = prefs.objectForKey(ViewController.profileImage) as? NSData {
let storedImage = UIImage.init(data: imageData)
profileImage.image = storedImage
}
// 獲得上次存儲(chǔ)的數(shù)據(jù)
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = .MediumStyle
if let lastUpdateStored = (prefs.objectForKey(ViewController.lastUpdate) as? NSDate) {
lastUpdateText.text = "Last Update:" + dateFormatter.stringFromDate(lastUpdateStored)
} else {
lastUpdateText.text = "從沒(méi)有更新"
}
}
// MARK: - UIImagePickerControllerDelegate方法
// 選擇圖片回調(diào)這個(gè)方法.
func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!){
self.dismissViewControllerAnimated(true, completion: nil)
saveSelectedImage(image)
}
// MARK: - Keyboard 處于編輯狀態(tài)時(shí)調(diào)用
// 關(guān)閉鍵盤(pán)
func dismissKeyboard(){
// 失去焦點(diǎn)
view.endEditing(true)
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
代碼不多,也簡(jiǎn)單柒凉!