ios中,在应用程序之外,提供集中的地方,来修改用户的偏好设置,并且序列化到文件。
创建项目
1.utility application模板
一个storyboard
一个主视图mainviewcontroller
一个辅助设置flipviewcontroller
使用设置捆绑包
当setting应用程序启动时,它会检查每个应用程序的设置捆绑包,并为包含设置捆绑包的每个应用程序添加设置组。
在项目中添加设置捆绑包
1. 新建文件 -> resource -> setting bundles
2. 展开settings.bundles,设置属性列表文件Root.plist
要点:
1) 在NSDictionary中,可以使用大多数对象作为键,
但是在属性列表Dictionary节点中,键必须为字符串类型,但是值可以为任何其他属性列表类型。
属性列表类型有: NSDictionary, NSArray, NSData, NSDate, NSBoolen, NSString, NSNumber
(control+右键,选择 show row keys/values选项,可切换到显示 真实的键值名称)
2)键为@"PreferenceSpecifiers",值为Array
Array中,又存储着一系列Dictionary, 每个都对应设置的一个条目
类型可为:Group(分组),Multi Value(多值选择),Slider(滑动块),Text Field(文本输入),Title, Toggle Switch(开关)
3)从一个分组开始,到另外一个分组之间的所有条目,都在此分组中。
4)如果要在应用程序捆绑包中使用图标,则需要把png给拷贝进捆绑包中。
因为设置捆绑包属于settings应用程序的一部分,settings应用程序不能访问本app的沙盒。
5)属性列表编辑器的使用注意:
如果选中某行,return
1.如果展开了,则将会在第一的位置插入子节点
2.如果没展开,则会在后面创建同级节点
3.支持复制粘贴
6)添加应用程序图标
AppSetting Target -》Summary -》找到应用程序图标的配置部分,拖入png文件即可。
7)添加子视图
类型:PSChildPaneSpecfier
链接到另外一个plist文件
创建More.plist的方法,复制Root.plist,重命名,修改
不能再xcode中,为应用程序捆绑包添加新文件,而且属性文件编辑器的save也不支持新文件保存到设置捆绑包中
所以,唯一的方法,是新建文件,另存到某个地方,然后通过finder拖入设置捆绑包中。
通过按一定格式编辑好Root.plist文件,可以在settings应用程序中,实现既定的编辑界面。
读取应用程序中的设置
在应用程序中修改默认设置
NSUserDefaults类提供了非常方便的方法来获取常用的类型,例如floats,doubles,intergers,Booleans,URLs。
所以一个NSUserDefaults的对象必须是属性表,这也就是说我们可以存储NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary这些实例。
如果你想存储其他类型的对象,你要将其归档并创建一个NSData来实现存储。
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//存储时,除NSNumber类型使用对应的类型以外,其他的都是使用setObject:forKey:
[userDefaults setInteger:myInteger forKey:@"myInteger"];
[userDefaults setFloat:myFloat forKey:@"myFloat"];
[userDefaults setDouble:myDouble forKey:@"myDouble"];
[userDefaults setObject: myString forKey:@"myString"];
NSInteger myInteger = [userDefaultes integerForKey:@"myInteger"];
float myFloat = [userDefaultes floatForKey:@"myFloat"];
double myDouble = [userDefaultes doubleForKey:@"myDouble"];
NSString *myString = [userDefaultes stringForKey:@"myString"];
NSDate *myDate = [userDefaultes valueForKey:@"myDate"];
NSArray *myArray = [userDefaultes arrayForKey:@"myArray"];
NSDictionary *myDictionary = [userDefaultes dictionaryForKey:@"myDictionary"];
你可能会问一个问题:
NSUserDefautls将数据存储在什么地方了???我都没有显示的指定路径???
用NSUserDefaults存储的数据下次程序运行的时候依然存在,它把数据存储在什么地方了?如何能够清除?
其实它存储在应用程序内置的一个plist文件里,这个可以根据路径看到。
比如说这个是你的程序沙盒位置
/UsersLibrary/Application Support/iPhoneSimulator/4.1/Applicati*****/29788E40-AF47-45A0-8E92-3AC0F501B7F4/,(这个是应用程序对应在mac上的位置)
这个下面有/Library/Prefereces,里面有个plist文件,存储的就是你的userDefaults
想要删掉的话,用removeObjectForKey或者删掉沙盒,也就是你的应用程序然后重新安装。
注意,设置被修改后,注意及时同步存储
[defaults synchronize]
此方法将会强制保存为保存的修改,并且将未修改的设置同步到defaults中
注册默认值
//第一次启动APP,设置默认值
1.如果不设置,则从NSUserDefault中读不到任何值,假如这些值没被修改过的话。
2.registerDefaults方法会判断是否有该keyvalue,如果有则说明用户已经设置过,不再修改。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSDictionary *defaults = @{
kWarpDriveKey : @YES,
kWarpFactorKey : @5,
kFavoriteSinKey : @"Greed"};
[[NSUserDefaults standardUserDefaults] registerDefaults: defaults];
return YES;
}
NSDictionary的快捷创建方法
@{key:value, key:value,......}
NSArray的快捷创建方法:
@[obj, obj, .....]
NSNumber的快捷创建方法:
@5
@YES
@2.1
使设置实时有效
应用从后台到唤醒后,重写获取,刷新用户设置
通知,通知中心
UIApplicationWillEnterForegroundNotification
关于通知中心机制,通知的订阅与取消,响应,需要在另外个专题中详细研究。
总结:
1.重点在“设置捆绑包”的创建和编辑Root.plist文件
command+N -> resource -》 settings bundle
2.通过编辑好的“设置捆绑绑”,settings应用可以读取plist文件,并生成既定的用户界面
3.在自己的app中,读取和设置用户设置,采用NSUserDefaults这个单例类
[NSUserDefaults standardUserDefaults]
objectForKey:
setObject: forKey:
在修改后,记得及时将修改同步到本地存储
synchronize
4.记得在app委托中,注册默认设置,采用方法
registerDefaults