应用设置Setting的实现
有非常多应用都在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)一般我们须要设置一些初始数据。也就是应用第一次打开就能将数据进行初始默认设置。
代码:
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- // Override point for customization after application launch.
- NSDictionary *defaults = @{kScreenAutoLock: @NO,
- kSensitivityValue: @5};
- [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
- return YES;
- }
通过一个dictionary来进行设置。这里的kScreenAutoLock是macro定义的key,就是identifier
2)在获取数据
- NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
- value = [defaults floatForKey:kSensitivityValue];
- switch = [defaults boolForKey:kScreenAutoLock];
3)更改数据
- NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
- [defaults setFloat:5.0f forKey:kSensitivityValue];
- [defaults synchronize];
记住要使用synchronize来实现数据的存储。
4)补充
单单使用上面的方法还不够,存在的问题就是假设我们在设置中进行设置更改,那么这是假设应用已启动,打开应用后数据由于没有同步。还是设置前的数据。
因此,在程序EnterForeground时候,应用应该进行数据的同步。
在使用中,就是通过notification,在EnterForeground时候同步更改的数据
代码:
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
- - (void)applicationWillEnterForeground:(NSNotification *)notification
- {
- [[NSUserDefaults standardUserDefaults] synchronize];
- [self refreshSettings]; // 更新设置显示
- }
关于settings的内容就介绍到这。
应用设置Setting的实现的更多相关文章
- 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 ...
- django1.8模板位置的设置setting.py
大多数django教程比较老,给出的template的设置方案为: 更改工程下的setting.py文件, TEMPLATE_DIRS = ( os.path.join( APP_DIR, ' ...
- django-1创建项目创建app设置setting、urls、templates、views等
1. python -m django --version 查看版本 1.11.4 在需要创建项目的目录下执行: 2. django-admin startproject myblog => 创 ...
- 发布设置setting.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- User-specific configuration ...
- Scrapy——5 下载中间件常用函数、scrapy怎么对接selenium、常用的Setting内置设置有哪些
Scrapy——5 下载中间件常用的函数 Scrapy怎样对接selenium 常用的setting内置设置 对接selenium实战 (Downloader Middleware)下载中间件常用函数 ...
- ABP框架 - 设置管理
文档目录 本节内容: 简介 关于ISettingStore 定义设置 setting scope(设置范围) 重写设置定义 获取设置值 服务端 客户端 修改设置 关于缓存 简介 每个应用必需存储一些设 ...
- mybatis setting配置
Mybatis配置报错元素类型为 "configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHan ...
- Django基础 - Debug设置为False后静态文件获取404
当设置setting.py文件当中的DEBUG=FALSE后,Django会默认使用Web Server的静态文件处理,故若没设置好Web Server对静态文件的处理的话,会出现访问静态文件404的 ...
- Webstorm6的汉化以及主题设置
Webstorm6.0.2界面截图: webstorm作为一款前端开发软件,被业内称为神器,下面是下载地址. 需要的人太多,邮件不过来,传到这边方便大家下载 汉化包 http://www.jetbra ...
随机推荐
- 洛谷P1908 逆序对
P1908 逆序对 2.2K通过 4.4K提交 题目提供者该用户不存在 标签云端 难度普及/提高- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 归并排序党注意了!数组要开… ...
- HTML 对空行和空格进行控制
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Mongoose 参考手册
转自:https://cnodejs.org/topic/548e54d157fd3ae46b233502 Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 ...
- Sql Server 2005 中的row_number() 分页技术
原文发布时间为:2009-05-08 -- 来源于本人的百度文章 [由搬家工具导入] 在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储 CRE ...
- AtCoder Regular Contest 075 C D E (暂时)
C - Bugged 题意 给\(n\)个数,找其中的一个子集,使得其和最大,且不是\(10\)的整数倍. 思路 先对\(n\)个数求和, 如果本身即不被\(10\)整除,则即为答案. 否则,如果本身 ...
- Scrapy学习-23-分布式爬虫
scrapy-redis分布式爬虫 分布式需要解决的问题 request队列集中管理 去重集中管理 存储管理 使用scrapy-redis实现分布式爬虫 github开源项目: https://g ...
- cobbler一键部署centos7.4(脚本)
执行脚本之前你需要做四件事 1. 关闭防火墙 2.关闭selinux 3.配置163或者阿里云的 yum源 4.上传centos7.4的镜像如下图 [root@cobbler ~]# cat auto ...
- hdu 4522(图论,构图)
湫湫系列故事——过年回家 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- AC日记——黑魔法师之门 codevs 1995
1995 黑魔法师之门 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 经过了16个工作日的紧张 ...
- 横竖屏切换,activity重建问题
最近有个需求,横屏直播A退出后返回直播列表页B(竖屏)时,在小米8上列表页B直接变成横屏的了,因为列表页B由竖屏切换成横屏了,还会重新执行生命周期onCreate()-onResume()等等. 为了 ...