如今,即便是最简单的计算机程序也会包含一个偏好设置窗口,用户可以在其中设置应用专属的选项。在MAC OS X中,Preferences...菜单通常位于应用菜单中。选择该菜单项会弹出一个窗口,用户可以在其中输入和更改各种选项。iPhone和其他iOS设备有一个专门的“设置”应用程序来进行各种设置,你肯定用过很多次了。

设置捆绑包

通过应用设置,用户可以输入和更改任何带有设置捆绑包(settings bundle)的应用中的偏好设置。设置捆绑包是应用自带的一组文件,用于告诉设置该应用期望得到用户的哪些偏好设置。下图是实例效果图:

       

对于iOS用户默认设置(User Defaults)机制,设置应用充当着通用用户界面的角色。用户默认设置是保存和获取偏好设置的系统的一部分。

在iOS应用中,用户默认设置由NSUserDefaults类实现。应用通过NSUserDefaults用键值对的方式来读取和保存偏好设置数据,与通过键从NSDictionary对象中获取数据一样。不同之处在于NSUserDefaults数据会被持久保存在文件系统中,而不是存储在内存的对象实例中。

应用

接下来的部分,通过创建一个简单的应用,来实现应用设置控制应用程序。

创建应用

在Xcode中,创建Tabbed Application工程。

使用设置捆绑包

设置应用使用每个应用中设置捆绑包的内容构建出一个应用的设置视图。如果应用没有设置捆绑包,则设置应用不会显示出应用程序的任何信息。每个设置捆绑包必须包含一个名为Root.plist的属性列表,它定义了根级偏好设置视图。此属性列表必须遵循一种非常严格的格式。

当设置应用启动时,它会检查每个应用程序的设置捆绑包并为包含设置捆绑包的每个应用添加设置组。

在项目中添加设置捆绑包

新建设置捆绑包,操作如下图

在iOS-->Resource-->Settings Bundle点击Next,名字保留默认,最后点击Create即可。

编辑属性列表文件

接下来需要编辑Root.plist文件,具体内容如下图

在Item8中,引用的More.plist文件,具体内容如下图

这里需要补充说明一点:

iOS上的应用不能从其他应用的沙盒中读取文件。设置捆绑包并不是我们应用沙盒的一部分,而是设置应用沙盒的一部分。

设计展示界面

数据准备好之后,添加图标资源,设计数据展示界面。效果图如下

    

界面是通过代码实现的,主要使用了如下几个控件:

@interface FirstViewController ()

@property (nonatomic, strong) UILabel *officerLabel;
@property (nonatomic, strong) UILabel *authorizationCodeLabel;
@property (nonatomic, strong) UILabel *rankLabel;
@property (nonatomic, strong) UILabel *warpDriveLabel;
@property (nonatomic, strong) UILabel *warpFactorLabel;
@property (nonatomic, strong) UILabel *favoriteTeaLabel;
@property (nonatomic, strong) UILabel *favoriteCaptainLabel;
@property (nonatomic, strong) UILabel *favoriteGadgetLabel;
@property (nonatomic, strong) UILabel *favoriteAlienLabel; @end
@interface SecondViewController ()

@property (nonatomic, strong) UISwitch *engineSwitch;
@property (nonatomic, strong) UISlider *warpFactorSlider;
@property (nonatomic, strong) UIButton *settingInfo; @end

读取应用中的设置

我们将使用NSUserDefaults类访问用户设置。NSUserDefaults作为单例类,意味着应用中只能有一个NSUserDefaults实例在运行。为了访问这个实例,需要调用standardUserDefaults。

键宏定义

#ifndef BridgeControl_Constants_h
#define BridgeControl_Constants_h #define kOfficerKey @"officer"
#define kAuthorizationCodeKey @"authorizationCode"
#define kRankKey @"rank"
#define kWarpDriveKey @"warp"
#define kWarpFactorKey @"warpFactor"
#define kFavoriteTeaKey @"favoriteTea"
#define kFavoriteCaptionKey @"favoriteCaptain"
#define kFavoriteGadgetKey @"favoriteGadget"
#define kFavoriteAlienKey @"favoriteAlien" #endif

更新主视图控制器

//FirstViewController.m

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self refreshFields];
} -(void)refreshFields{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.officerLabel.text = [defaults objectForKey:kOfficerKey];
self.authorizationCodeLabel.text = [defaults objectForKey:kAuthorizationCodeKey];
self.rankLabel.text = [defaults objectForKey:kRankKey];
self.warpDriveLabel.text = [defaults boolForKey:kWarpDriveKey] ? @"engaged" : @"Disabled";
self.warpFactorLabel.text = [[defaults objectForKey:kWarpFactorKey] stringValue];
self.favoriteTeaLabel.text = [defaults objectForKey:kFavoriteTeaKey];
self.favoriteCaptainLabel.text = [defaults objectForKey:kFavoriteCaptionKey];
self.favoriteGadgetLabel.text = [defaults objectForKey:kFavoriteGadgetKey];
self.favoriteAlienLabel.text = [defaults objectForKey:kFavoriteAlienKey];
}
//SecondViewController.m

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self refreshFields];
} -(void)refreshFields{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.engineSwitch.on = [defaults boolForKey:kWarpDriveKey];
self.warpFactorSlider.value = [defaults floatForKey:kWarpFactorKey];
}

添加控件响应事件

为SecondViewController中的UIButton,UISwitch和UISlider控件添加监听事件。

- (void)engineSwitchTapped {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:self.engineSwitch.on forKey:kWarpDriveKey];
[defaults synchronize];
} - (void)warpSliderTouched {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setFloat:self.warpFactorSlider.value forKey:kWarpFactorKey];
[defaults synchronize];
}
//切换到“设置”应用程序
-(void)settingInfoClicked{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}

注册默认值

//AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. //程序启动后的一些自定义设置
NSDictionary *defaults = @{kWarpDriveKey:@YES,
kWarpFactorKey:@,
kFavoriteAlienKey:@"Vulcan"
};
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; return YES;
}

保证设置有效

如果现在将应用运行,查看设置信息并按下主屏幕按钮来修改一些值。然后再按Home键,再重新打开应用,结果发现设置并没有生效。

原因在于:在iOS中,当应用正在运行时按Home键并不会退出该应用,而是由操作系统在后台将其暂停,这样它就能随时快速启动。

在这个例子中,我们需要添加一点工作,以实现应用被唤醒时,能重新加载用户偏好设置并重新显示它们。

通知,时对象之间进行通信的轻量级机制。任何对象都能定义一个或多个发送到应用通知中心的通知。通知中心是一个单例对象,作用在于对象之间传送通知。

UIApplication类会发送大量的通知,大多数通知的用途从命名就能看出来,这个例子中我们就使用到了通知。

将下列代码添加到两个控制器的viewDidLoad方法中:

UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:app];

然后添加相应的响应方法

-(void)applicationWillEnterForeground:(NSNotification *)notification{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults synchronize];
[self refreshFields];
}

小结

本文主要讲解了如何使用应用设置,如何使用NSUserDefaults读取偏好设置,以及如何让用户在应用内修改偏好设置。

实例源代码地址:https://github.com/CharsDavy/BridgeControl

iOS学习之应用偏好设置的更多相关文章

  1. ios NSUserDefaults存储数据(偏好设置)

    ios NSUserDefaults存储数据(偏好设置) 1.NSUserDefaults用于存储数据量小的数据,主要是用户配置,但也可以支持存储一些小数据包括:NSString, NSNumber, ...

  2. iOS:沙盒、偏好设置、归档、解归档

    一.沙盒和应用程序包 •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒 •iOS常用目录: –Bundle –Documents –Library/Ca ...

  3. iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

    1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...

  4. iOS数据持久化文件读写之偏好设置

    很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能.每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如, ...

  5. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  6. iOS开发之数据存储之Preference(偏好设置)

    1.概述 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能. 每个应用都有个NSUserDefaults实例,通过它来存取偏好 ...

  7. iOS: 偏好设置的详解和使用

    偏好设置的详解: 用途:主要用来存储用户系统的设备信息,但有的时候也可以在程序的任何地方用来存储数据,作为全局数据来访问,例如视图切换需要进行登录时. 偏好设置的写入: •很多iOS应用都支持偏好设置 ...

  8. ios应用数据存储方式(偏好设置)-转

    一.简单介绍 1.很多ios应用都支持偏好设置,比如保存用户名,密码,字体大小等设置,ios提供了一套标准的解决方案来为应用加入偏好设置功能. 2.每个应用都有个NSUserDefaults实例,通过 ...

  9. IOS 偏好设置数据 存 取(Preferences文件夹)

    很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设 置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用都有个NSUserDefaults实例,通过它来存取偏好设置 比如 ...

随机推荐

  1. Spark1.5堆内存分配

    这是spark1.5及以前堆内存分配图 下边对上图进行更近一步的标注,红线开始到结尾就是这部分的开始到结尾 spark 默认分配512MB JVM堆内存.出于安全考虑和避免内存溢出,Spark只允许我 ...

  2. Webdings 图形字体

    如果想在网页上插入图形,最简单的方式就是使用图形字体.Webdings 是一种微软开发的图形字体,在IE浏览器上可以使用它. 什么是Webdings Webdings 是一个TrueType的ding ...

  3. go 语言学习笔计之结构体

    go 语言中的结构体方法 结构体名称的大小写有着不同的意义: 小写表示不能被别的包访问 package main import "fmt" type Rect struct { w ...

  4. Socket创建失败:10093错误

    10093的错误,应用程序没有调用 WSAStartup,或者 WSAStartup 失败. 问题描述:Failed to create UDP socket:10093!Close and rest ...

  5. C语言 函数指针三(反向调用)

    动态库代码 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib. ...

  6. 03 Java图形化界面设计——布局管理器之FlowLayout(流式布局)

    前文讲解了JFrame.JPanel,其中已经涉及到了空布局的使用.Java 虽然可以以像素为单位对组件进行精确的定位,但是其在不同的系统中将会有一定的显示差异,使得显示效果不尽相同,为此java提供 ...

  7. 你的企业是否须要开发APP?

    移动互联网时代的到来,粗分出"新兴行业"与"传统行业".除了互联网公司,其它似乎都被归到了"传统行业".连传统行业中最传统的房地产公司代表人 ...

  8. smartJS 0.1 API 讲解 - Trigger

    上篇介绍了PromiseEvent,本篇介绍Trigger - 基于Promise的aop的体现:(感觉自己的对这些命名一直都很挫,也懒得想了,所以就凑合的用) Trigger 在目标对象上加入触发器 ...

  9. 【VBA】合并多个excel文件

    From http://www.zhihu.com/question/20366713 VBA代码如下: Sub 工作薄间工作表合并() Dim FileOpen Dim X As Integer A ...

  10. AWS系列-申请Redis

    1.1 打开aws控制台,可以直接搜索redis 1.2 进入redis控制面板 点击启动缓存集群(这个只是启动创建的意思,不是启动下面创建好的node.我也不懂为啥翻译过来是这个意思...) 1.3 ...