0%

[swift] 用Plist製作設定檔

很多APP都會有一些各人化設定檔,方便下次打開APP可以依照個人的喜好設定做出最適合的調整,接下來就實作如何將個人的設定檔存起來並在下次打開APP時Show出來

  • 首先先拉一個畫面,輸入框,確定按鈕,呈現文字的按鈕,我們的目標是在輸入框輸入的文字會被系統儲存起來,在下次App重開時依然顯示最後設定的文字
  • 基本的code如下,只要在輸入框填好後按下確定按鈕就可以更改文字了,但你只要重開APP他就又會回到最原本Button的文字 ```swift
    import UIKit
    class plistViewController: UIViewController {
    @IBOutlet weak var txtbox: UITextField! //輸入文字框
    @IBOutlet weak var btnShowText: UIButton! //show文字的button
    @IBOutlet weak var btnSetting: UIButton! //確定按鈕
    override func viewDidLoad() {
      super.viewDidLoad();
    
    }
    @IBAction func btnSetting_click(sender: AnyObject) {
      //將輸入的文字設定給btnShowText
      btnShowText.setTitle(txtbox.text, forState: UIControlState.Normal);
    
    }
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[![](http://1.bp.blogspot.com/-9CI9oydHno0/VPWJqOmri8I/AAAAAAAAEd4/dbIiK5hekEI/s400/image.gif)](http://1.bp.blogspot.com/-9CI9oydHno0/VPWJqOmri8I/AAAAAAAAEd4/dbIiK5hekEI/s1600/image.gif)
* 所以我們至少應該先把按鈕的文字改成抓Plist檔的來源,然後按下確定按鈕時將文字先存到plist檔中,但這邊有個觀念需要先釐清,**<span style="color: red;">基本上IOS APP是SandBox模式</span>**,所以只有特定資料夾內的檔案是可以寫入的,所以在這之前我們必須先新建一個Setting.plist檔案專門放設定值(建議不要用原本預設的info.plist,因為之後會移動這個檔案位置),然後在APP開啟時檢查這個檔案是否在可讀寫的資料夾之中了,如果沒有則複製一份過去,步驟如下

先在Setting.plist新增儲存按鈕文字的欄位
[![](http://3.bp.blogspot.com/-OC9a4bKFHCA/VPWKf_BN2oI/AAAAAAAAEeA/L_A21cnwvR4/s400/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%2B2015-03-03%2B%E4%B8%8B%E5%8D%886.17.54.png)](http://3.bp.blogspot.com/-OC9a4bKFHCA/VPWKf_BN2oI/AAAAAAAAEeA/L_A21cnwvR4/s1600/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%2B2015-03-03%2B%E4%B8%8B%E5%8D%886.17.54.png)

接著在AppDelegate.swift的didFinishLaunchingWithOptions寫下 ```swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
//Setting Plist因為要可以讀寫,所以要移到Documents的folder底下
let path:String = NSBundle.mainBundle().pathForResource("Setting", ofType: "plist")!;
let destinationPath = String(format: "%@/Documents/Setting.plist", arguments:[NSHomeDirectory()]);
var fm: NSFileManager = NSFileManager();
if (!fm.fileExistsAtPath(destinationPath))
{
//如果在documents資料夾底下找不到該檔案,則複製一份過去
fm.copyItemAtPath(path, toPath: destinationPath, error: nil);
}
return true
}


接下來將輸入的文字改存到plist中,然後按鈕文字的來源改成Setting.plist,全部程式碼如下 ```swift
import UIKit
class plistViewController: UIViewController {
@IBOutlet weak var txtbox: UITextField! //輸入文字框
@IBOutlet weak var btnShowText: UIButton! //show文字的button
@IBOutlet weak var btnSetting: UIButton! //確定按鈕
override func viewDidLoad() {
super.viewDidLoad();
loadBtnText();
}
private func loadBtnText(){
//button預設的字由Setting plist來
btnShowText.setTitle(getSettingValue(), forState: UIControlState.Normal);
}
@IBAction func btnSetting_click(sender: AnyObject) {
//將輸入的文字設定給btnShowText
//btnShowText.setTitle(txtbox.text, forState: UIControlState.Normal);
//修改成將輸入的文字存到Setting.plist後,在由那邊load給button
Set_SettingPlist_Value(txtbox.text);
loadBtnText();
}
//取得Setting.plist裡btnText欄位得值
private func getSettingValue() -> String{
var value:String!;
//取得document folder底下的Setting.plist路徑
let SettingPath = String(format: “%@/Documents/Setting.plist”, arguments:[NSHomeDirectory()]);
var dic:NSMutableDictionary? = NSMutableDictionary(contentsOfFile: SettingPath);
//欄位名稱
if (dic?.objectForKey(“btnText”) != nil){
value = dic!.objectForKey(“btnText”) as String;
}
return value;
}
//把值存到Setting.plist裡面
private func Set_SettingPlist_Value(value:String){
let SettingPath = String(format: “%@/Documents/Setting.plist”, arguments:[NSHomeDirectory()]);
var dic:NSMutableDictionary = NSMutableDictionary(contentsOfFile: SettingPath)!;
if (dic.objectForKey(“btnText”) != nil) {
dic.setValue(value, forKey: “btnText”);
//true表示IOS會先將資料寫入一個輔助檔案中,然後再將這個檔案改為最後真正的目的地,避免出現錯誤
dic.writeToFile(SettingPath, atomically: true);
}
}
}

1
2
3
4
5
6
7
8
9

* 接下來再試試看程式,你會發現即便把APP關掉,下次進來時button的文字會被記錄下來!!
但這邊必須特別注意一點,隨著App的開發可能會對plist有刪減,重新部署到模擬器上時要記得先把舊的APP刪掉,讓Xode幫你重新安裝,原因是我們在AppDelegate.swift的didFinishLaunchingWithOptions寫了 ```swift
if (!fm.fileExistsAtPath(destinationPath))
{
//如果在documents資料夾底下找不到該檔案,則複製一份過去
fm.copyItemAtPath(path, toPath: destinationPath, error: nil);
}

也就是說複製過一次後,之後的欄位有增減都無法改到Documents資料夾底下的那份plist了,所以只能刪除重裝!!