關於設置與配置
1]設置 :應用之外的一個應用
2]配置:應用內開闢的一塊功能
對於一個應用,如果設置的時候需要先退出的話,一般情況屬於設置,不需要退出的話則爲配置(例如:遊戲的音響開啓屬於配置 )
設置
對於設置與配置有個大概的瞭解之後,接下來就說一下如何給一個應用添加“設置”的相關內容
應用程序設置包(Settings Bundle)
1、創建
(1)先創一個YCF_Test的工程
(2)File -> New -> New -> iOS -> Resource -> Settings Bundle -> next -> create :操作完得到Settings.bundle,如下:
Root.Strings內容:
"Group" = "Group";
"Name" = "Name";
"none given" = "none given";
"Enabled" = "Enabled";
Root.plist內容:
2、顯示詳細內容
選擇圖一的Settings.bundle -> Show in Finder ->選中Finder中的Settings.bundle -> 顯示包內容
3、添加文件或圖片
(1)顯示詳細內容
(2)將文件或圖片拖進即可
運行看效果:
點擊YCF_Test可以看到:
設置
下面進行“設置”的添加,也就是對圖二中的Preference Items內容修改成我們所需要的:
將會涉及6種類型:
Group 、 Multi Value 、 Slider 、 Text Field 、Title 、 Toggle Switch
1、PSGroupSpecifier – 相當於tableView的header
(1)應該放在該組最前面
(2)如果添加的標題前面沒有任何分組的信息,則默認爲一個分組
(3)可以通過兩種方式:
方式一:
方式二:
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>賬號</string>
</dict>
2、PSTextFieldSpecifier
方法一:
爲什麼要設置Identifier呢?
下面獲取設置信息時,我們將通過Identifier來區分
方法二:
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>用戶名</string>
<key>Key</key>
<string>name_preference</string>
<key>KeyboardType</key>
<string>Alphabet</string>
<key>IsSecure</key>
<false/>
<key>DefaultValue</key>
<string></string>
<key>AutocorrectionType</key>
<string>None</string>
<key>AutocapitalizationType</key>
<string>None</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>密碼</string>
<key>Key</key>
<string>password_preference</string>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
<key>KeyboardType</key>
<string>Alphabet</string>
<key>IsSecure</key>
<true/>
<key>DefaultValue</key>
<string></string>
</dict>
3、其他的具體操作就不詳說
PSToggleSwitchSpecifier
PSSliderSpecifier
PSMultiValueSpecifier
PSChildPaneSpecifier
PSTitleValueSpecifier
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string></string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>每月流量控制</string>
<key>Key</key>
<string>enable_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>每月流量控制(GB)</string>
</dict>
<dict>
<key>Type</key>
<string>PSSliderSpecifier</string>
<key>Key</key>
<string>slider_preference</string>
<key>DefaultValue</key>
<real>0.5</real>
<key>MinimumValueImage</key>
<string>[email protected]</string>
<key>MaximumValueImage</key>
<string>Menu_Icon_Message_Point@2x</string>
<key>MinimumValue</key>
<integer>0</integer>
<key>MaximumValue</key>
<integer>1</integer>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string></string>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Values</key>
<array>
<string>你的服務器</string>
<string>我的服務器</string>
</array>
<key>Title</key>
<string>服務器</string>
<key>Key</key>
<string>multiValue_preference</string>
<key>DefaultValue</key>
<string>可選服務器</string>
<key>Titles</key>
<array>
<string>本地服務器</string>
<string>遠程服務器</string>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
<key>Title</key>
<string>通知</string>
<key>File</key>
<string>Notification</string>
</dict>
從上面看到PSMultiValueSpecifier的Values和Titles內容很像
<key>Values</key>
<array>
<string>你的服務器</string>
<string>我的服務器</string>
</array>
<key>Titles</key>
<array>
<string>本地服務器</string>
<string>遠程服務器</string>
</array>
Values的內容是獲取設置內容是看到的信息
Titles的內容是提供的選項中可見的
PSMultiValueSpecifier 與 PSChildPaneSpecifier :
PSMultiValueSpecifier :多選一
“通知”的點擊後跳轉到另一個界面,該界面的設置用Notification.plist
(1)創建Notification.plist
(2)添加內容
複製Root.plist中的:
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
然後補全爲:
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Title</key>
<string></string>
<key>Type</key>
<string>PSGroupSpercifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>sound_enabled_preference</string>
<key>Title</key>
<string>聲音</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<true/>
<key>Key</key>
<string>vibrate_enabled_preference</string>
<key>Title</key>
<string>振動</string>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
</dict>
</array>
看一下運行效果:
讀取設置內容
// 根據要求搭建UI
// Created by 陽丞楓 on 16/10/27.
// Copyright © 2016年 chengfengYang. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *password;
@property (weak, nonatomic) IBOutlet UILabel *username;
@property (weak, nonatomic) IBOutlet UILabel *clearCache;
@property (weak, nonatomic) IBOutlet UILabel *flowermeter;
@property (weak, nonatomic) IBOutlet UILabel *serverName;
@property (weak, nonatomic) IBOutlet UILabel *notiSound;
@property (weak, nonatomic) IBOutlet UILabel *notiVibrate;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated {
[self getData:nil];
}
- (IBAction)getData:(id)sender {
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
self.username.text = [userDefault stringForKey:@"name_preference"];
self.password.text = [userDefault stringForKey:@"password_preference"];
if([userDefault boolForKey:@"enable_preference"]) {
self.clearCache.text = @"YES";
} else {
self.clearCache.text = @"NO";
}
self.flowermeter.text = [NSString stringWithFormat:@"%.2fGB", [userDefault doubleForKey:@"slider_preference"]];
self.serverName.text = [userDefault stringForKey:@"multiValue_preference"];
if([userDefault boolForKey:@"sound_enabled_preference"]) {
self.notiSound.text = @"YES";
} else {
self.notiSound.text = @"NO";
}
if([userDefault boolForKey:@"vibrate_enabled_preference"]) {
self.notiVibrate.text = @"YES";
} else {
self.notiVibrate.text = @"NO";
}
}
@end
(1)刪除模擬器的應用再運行
(2)進行有關設置
(3)點擊按鈕“查看修改後的按鈕”
大致流程如上
問題
未進行設置前,所有BOOLEAN類型的值都輸出位NO,但是很明顯所有PSToggleSwitchSpecifier的DefaultValue都設置爲YES
有沒有可能返回nil而被初始化爲NO呢?
(lldb) po [userDefault boolForKey:@"enable_preference"]
NO
(lldb)
明顯返回值就是NO
也就是說默認設置只能被“設置”所識別,而獲取默認設置信息時是無效的
在stack overflow看到:https://oleb.net/blog/2014/02/nsuserdefaults-handling-default-values/
【未完,待續···】