有非常多应用都在iOS设置中有相关的设置。例如以下图:

   

通过这个设置能够方便的相应用的一些主要的设置进行更改。

要完整的实现这个设置功能,有下面几方面问题须要解决:

1)设置的编写(实现设置的功能)

2)设置内容的存储(保证设置经过更改后能马上生效。

比方最小化应用,然后在设置中更改,又一次打开应用,应该显示新的设置方式)

关于这方面的内容能够參考苹果开发文档:Preferences and Settings Programming Guide

以下说一下实现过程:

STEP 1:编写设置

通过Settings Bundle来实现。

1) 新建一个Settings Bundle:

创建好后能够看到例如以下内容:

我们能够看到,settings bundle里面包括了两个文件。一个是Root.plist用于设置要设置的内容。还有一个Root.strings用于多语言化。我们如今不考虑多语言化的内容,仅仅看Root.plist的设置方法。

我们看到Root.plist文件中面已经预先有几个item。这些就是要设置的内容。一共同拥有7种类型:

这些非常好理解,除了Child pane都是一些控件。仅仅是这里通过plist文件来实现。Child pane是子页面,可能相对麻烦一点。先说一下前面几个。

首先看一下要的效果:

1)Group

设置例如以下:

2)Text Field

设置例如以下:

这里的identifier就是之后存储须要用到的Key。就是利用NSUserDefaults,之后介绍。

然后Text Field is Secure这个选项就是设置是否加密。

其它都非常easy理解。

3)Toggle Switch

4)Slider

能够加入左右图片

5)Multi Value

设置例如以下:

以下介绍一下Child Pane的使用。

要加入新的设置页面,须要创建新的plist。

上图摘自开发文档,能够非常清楚的看出结构。

因此我们须要创建新的plist文件。

关键点在于我们不能在Xcode中创建,由于在Xcode中我们无法将文件拉进bundle里面,因此。最简单的方法就是。打开bundle的文件管理器。然后复制Root.plist,再改名。!!

接下来是设置Child Pane:

filename就是新的plist的名称,无需加后缀。

然后在Child.plist的编辑和Root.plist一样。关键点在于为了编辑方便,应该将Child.plist的类型设置为iPhone Settings plist

OK。通过上面的方法,我们就能够在界面上完毕须要的设置功能。以下是进行数据的操作。

STEP 2:使用NSUserDefaults实现preference的存储。

首先明白的是上面的Setting的数据将存储在NSUserDefaults中StandardDefaults其中,每一个设置相应的identifier就是Key。

1)一般我们须要设置一些初始数据。也就是应用第一次打开就能将数据进行初始默认设置。

代码:

[plain] view plaincopy

 
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3. // Override point for customization after application launch.
  4. NSDictionary *defaults = @{kScreenAutoLock: @NO,
  5. kSensitivityValue: @5};
  6. [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
  7. return YES;
  8. }

通过一个dictionary来进行设置。这里的kScreenAutoLock是macro定义的key,就是identifier

2)在获取数据

[plain] view plaincopy

 
  1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  2. value = [defaults floatForKey:kSensitivityValue];
  3. switch  = [defaults boolForKey:kScreenAutoLock];

3)更改数据

[plain] view plaincopy

 
  1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  2. [defaults setFloat:5.0f forKey:kSensitivityValue];
  3. [defaults synchronize];

记住要使用synchronize来实现数据的存储。

4)补充

单单使用上面的方法还不够,存在的问题就是假设我们在设置中进行设置更改,那么这是假设应用已启动,打开应用后数据由于没有同步。还是设置前的数据。

因此,在程序EnterForeground时候,应用应该进行数据的同步。

在使用中,就是通过notification,在EnterForeground时候同步更改的数据

代码:

[plain] view plaincopy

 
  1. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
[plain] view plaincopy

 
  1. - (void)applicationWillEnterForeground:(NSNotification *)notification
  2. {
  3. [[NSUserDefaults standardUserDefaults] synchronize];
  4. [self refreshSettings]; // 更新设置显示
  5. }

关于settings的内容就介绍到这。

应用设置Setting的实现的更多相关文章

  1. Spark2.2+ES6.4.2(三十二):ES API之index的create/update/delete/open/close(创建index时设置setting,并创建index后根据avro模板动态设置index的mapping)

    要想通过ES API对es的操作,必须获取到TransportClient对象,让后根据TransportClient获取到IndicesAdminClient对象后,方可以根据IndicesAdmi ...

  2. django1.8模板位置的设置setting.py

    大多数django教程比较老,给出的template的设置方案为: 更改工程下的setting.py文件, TEMPLATE_DIRS = (     os.path.join( APP_DIR, ' ...

  3. django-1创建项目创建app设置setting、urls、templates、views等

    1. python -m django --version 查看版本 1.11.4 在需要创建项目的目录下执行: 2. django-admin startproject myblog => 创 ...

  4. 发布设置setting.xml

    <?xml version="1.0" encoding="UTF-8"?> <!-- User-specific configuration ...

  5. Scrapy——5 下载中间件常用函数、scrapy怎么对接selenium、常用的Setting内置设置有哪些

    Scrapy——5 下载中间件常用的函数 Scrapy怎样对接selenium 常用的setting内置设置 对接selenium实战 (Downloader Middleware)下载中间件常用函数 ...

  6. ABP框架 - 设置管理

    文档目录 本节内容: 简介 关于ISettingStore 定义设置 setting scope(设置范围) 重写设置定义 获取设置值 服务端 客户端 修改设置 关于缓存 简介 每个应用必需存储一些设 ...

  7. mybatis setting配置

    Mybatis配置报错元素类型为 "configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHan ...

  8. Django基础 - Debug设置为False后静态文件获取404

    当设置setting.py文件当中的DEBUG=FALSE后,Django会默认使用Web Server的静态文件处理,故若没设置好Web Server对静态文件的处理的话,会出现访问静态文件404的 ...

  9. Webstorm6的汉化以及主题设置

    Webstorm6.0.2界面截图: webstorm作为一款前端开发软件,被业内称为神器,下面是下载地址. 需要的人太多,邮件不过来,传到这边方便大家下载 汉化包 http://www.jetbra ...

随机推荐

  1. jquery操作select(取值,设置选中

    比如<select class="selector"></select> 1.设置value为pxx的项选中 $(".selector" ...

  2. C++字符串高效查找替换,有空分析分析

    void CWebTransfer::Substitute(char *pInput, char *pOutput, char *pSrc, char *pDst) { char *pi, *po, ...

  3. 【bzoj2738】矩阵乘法 整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...

  4. 【bzoj1367】[Baltic2004]sequence 可并堆

    题目描述 输入 输出 一个整数R 样例输入 7 9 4 8 20 14 15 18 样例输出 13 题解 可并堆,黄源河<左偏树的特点及其应用>Page 13例题原题 #include & ...

  5. 【bzoj1803】Spoj1487 Query on a tree III DFS序+主席树

    题目描述 You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node w ...

  6. Newton 插值法

    定义 $f(x)$ 关于 $x_0, x_1, \dots, x_k$ 的 $k$ 阶均差(差商)记做 $ f [x_0, x_1, \dots, x_k] $,均差是递归定义的,有两种等价定义 \b ...

  7. nodeJS学习(3)--- npm 配置和安装 express4.X 遇到的问题及解决

    前言:懒得看前面两篇介绍的也可以从本节直接参考,但建议最好了解下,因为 4.X 的express 已经把命令行工具分离出来 (链接https://github.com/expressjs/genera ...

  8. vue项目中使用vue-awesome

    公司在项目重构时,遇到图标问题,然后把vue-awesome.iconfont.iconMoon都试了一遍,虽然最终使用了iconMoon但是也要把这两个过程记录一下. github地址 1.首先安装 ...

  9. 洛谷 [P2051] 中国象棋

    DP orz__stdcall 首先要想出来,每行最多只能放两个棋子,这是显然的 于是决策就是一行一行地处理 30分的做法就是裸的枚举,暴搜,枚举这一行放哪里,放几个 然后想到了压位dp,按3进制表示 ...

  10. linux之tee

    tee命令 tee把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中 如果想看到输出的同时,把输出也同时拷入一个文件,这个命令很合适 格式:tee -a file -a 表示文件追加到末尾 ...