關於設置與配置
1]設置 :應用之外的一個應用
2]配置:應用內開辟的一塊功能
對於一個應用,如果設置的時候需要先退出的話,一般情況屬於設置,不需要退出的話則為配置(例如:游戲的音響開啟屬於配置 )
對於設置與配置有個大概的了解之後,接下來就說一下如何給一個應用添加“設置”的相關內容
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)可以通過兩種方式:
方式一:
vcq9tv6jujwvcD4NCjxwcmUgY2xhc3M9"brush:java;">
2、PSTextFieldSpecifier
方法一:

為什麼要設置Identifier呢?
下面獲取設置信息時,我們將通過Identifier來區分
方法二:
Type
PSTextFieldSpecifier
Title
用戶名
Key
name_preference
KeyboardType
Alphabet
IsSecure
DefaultValue
AutocorrectionType
None
AutocapitalizationType
None
Type
PSTextFieldSpecifier
Title
密碼
Key
password_preference
AutocapitalizationType
None
AutocorrectionType
No
KeyboardType
Alphabet
IsSecure
DefaultValue
3、其他的具體操作就不詳說
PSToggleSwitchSpecifier
PSSliderSpecifier
PSMultiValueSpecifier
PSChildPaneSpecifier
PSTitleValueSpecifier
Type
PSGroupSpecifier
Title
Type
PSToggleSwitchSpecifier
Title
每月流量控制
Key
enable_preference
DefaultValue
Type
PSGroupSpecifier
Title
每月流量控制(GB)
Type
PSSliderSpecifier
Key
slider_preference
DefaultValue
0.5
MinimumValueImage
Menu_Download@2x.png
MaximumValueImage
Menu_Icon_Message_Point@2x
MinimumValue
0
MaximumValue
1
Type
PSGroupSpecifier
Title
Type
PSMultiValueSpecifier
Values
你的服務器
我的服務器
Title
服務器
Key
multiValue_preference
DefaultValue
可選服務器
Titles
本地服務器
遠程服務器
Type
PSChildPaneSpecifier
Title
通知
File
Notification
從上面看到PSMultiValueSpecifier的Values和Titles內容很像
Values
你的服務器
我的服務器
Titles
本地服務器
遠程服務器
Values的內容是獲取設置內容是看到的信息
Titles的內容是提供的選項中可見的
PSMultiValueSpecifier 與 PSChildPaneSpecifier :
PSMultiValueSpecifier :多選一

“通知”的點擊後跳轉到另一個界面,該界面的設置用Notification.plist
(1)創建Notification.plist
(2)添加內容

復制Root.plist中的:
StringsTable Root PreferenceSpecifiers
然後補全為:
StringsTable Root PreferenceSpecifiers Title Type PSGroupSpercifier DefaultValue Key sound_enabled_preference Title 聲音 Type PSToggleSwitchSpecifier DefaultValue Key vibrate_enabled_preference Title 振動 Type PSToggleSwitchSpecifier
看一下運行效果:



// 根據要求搭建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
也就是說默認設置只能被“設置”所識別,而獲取默認設置信息時是無效的