【读书笔记】iOS-iOS开发之iOS程序偏好设置(Settings Bundle)的使用
在Android手机上, 在某个程序里,通过按Menu键,一般都会打开这个程序的设置,而在iOS里,系统提供了一个很好的保存程序设置的机制。就是使用Settings Bundle。
在按了HOME键的情况下,在第一页的图标中找到设置,会看到程序的设置都在这里。那如何添加自己的程序的设置项呢?
1、添加设置项
默认情况下,新建的项目程序是没有设置项的。新建一个项目,命名为 SettingsBundleDemo,选择Single View App模版创建。项目创建完成,在项目里选择创建新文件,
选择Resource 中的Settings Bundle,创建。
再给程序添加一个icon。运行。按home键,打开设置,看到设置里多了一项,SettingsBundleDemo。这就为程序添加了一个设置。
2、设置的控件
默认的生成的设置项里有这个几个控件。
分别是:Group分组,文本框,Slider,开关控件几个控件。
设置想能使用的控件如下:
设置控件 | 类型 |
---|---|
文本框 | PSTextFieldSpecifier |
文字 | PSTitleValueSpecifier |
开关控件 | PSToggleSwitchSpecifier |
Slider | PSSliderSpecifier |
Multivalue | PSMultiValueSpecifier |
Group | PSGroupSpecifier |
子面板 | PSChildPaneSpecifier . |
3、编辑设置项的文件
展开Settings.bundle,其中包含一个Root.plist。Settings程序中的显示项就是从Root.plist中获取的。单击Root.plist以打开它,在空白处单击,选中Show Raw Keys/Values:
我们把原有的项删掉,添加自己的设置项,添加如下:
对应的plist源文件是这样的:如果你觉得自己手工输入这些项很慢,可以把下面的源文件拷贝到Root.plist里,用源代码打开方式就可以编辑了。
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
- <plist version="1.0">
- <dict>
- <key>PreferenceSpecifiers</key>
- <array>
- <dict>
- <key>Type</key>
- <string>PSGroupSpecifier</string>
- <key>Title</key>
- <string>个人信息</string>
- <key>Key</key>
- <string></string>
- </dict>
- <dict>
- <key>Type</key>
- <string>PSTextFieldSpecifier</string>
- <key>Title</key>
- <string>姓名</string>
- <key>Key</key>
- <string>username</string>
- </dict>
- <dict>
- <key>Type</key>
- <string>PSMultiValueSpecifier</string>
- <key>Values</key>
- <array>
- <string>football</string>
- <string>basketball</string>
- <string>pingpong</string>
- </array>
- <key>Title</key>
- <string>爱好</string>
- <key>Titles</key>
- <array>
- <string>足球</string>
- <string>篮球</string>
- <string>乒乓球</string>
- </array>
- <key>Key</key>
- <string>aihao</string>
- <key>DefaultValue</key>
- <string>football</string>
- </dict>
- <dict>
- <key>FalseValue</key>
- <string>NO</string>
- <key>TrueValue</key>
- <true/>
- <key>DefaultValue</key>
- <false/>
- <key>Type</key>
- <string>PSToggleSwitchSpecifier</string>
- <key>Title</key>
- <string>婚姻状况</string>
- <key>Key</key>
- <string>maritalStatus</string>
- </dict>
- <dict>
- <key>Type</key>
- <string>PSGroupSpecifier</string>
- <key>Title</key>
- <string>等级</string>
- <key>Key</key>
- <string></string>
- </dict>
- <dict>
- <key>DefaultValue</key>
- <integer>5</integer>
- <key>MaximumValue</key>
- <integer>10</integer>
- <key>MinimumValue</key>
- <integer>1</integer>
- <key>Type</key>
- <string>PSSliderSpecifier</string>
- <key>Title</key>
- <string>等级</string>
- <key>Key</key>
- <string>levelState</string>
- </dict>
- </array>
- <key>StringsTable</key>
- <string>Root</string>
- </dict>
- </plist>
这时候运行,在来到设置项看:
已经是我们自己设置的效果了。
4、在程序中获取Settings 和写入Settings 添加UI
这里的项目是设置好了,那怎么读取呢?我们先在程序里添加一些对应的UI.打开.xib文件,往里放置控件,并生成对应的映射和Action。
pickerView的使用请参考iOS学习之UIPickerView控件的简单使用这篇文章。
5、实现读取设置和保存代码
关键是通过: NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];
代码获取设置项的NSUserDefaults值,然后通过key获取设置的内容和保存设置内容
在两个Button的按下事件实现如下:
- - (IBAction)getSettings:(id)sender {
- NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
- username.text = [defaults objectForKey:@"username"];
- selectedAihao = [defaults objectForKey:@"aihao"];
- NSLog(@"aihao:%@",selectedAihao);
- NSInteger aihaoIndex = [aihaoValues indexOfObject:selectedAihao];
- [pickerView selectRow:aihaoIndex inComponent:0 animated:YES];
- [level setValue:[defaults integerForKey:@"levelState"]];
- }
- - (IBAction)setSettings:(id)sender {
- NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
- [defaults setValue:username.text forKey:@"username"];
- NSInteger aihaoIndex = [aihaoTitles indexOfObject:selectedAihao];
- [defaults setValue:[aihaoValues objectAtIndex:aihaoIndex] forKey:@"aihao"];
- [defaults setInteger:level.value forKey:@"levelState"];
- UIAlertView *alert = [[UIAlertView alloc]
- initWithTitle:@"偏好设置"
- message:@"偏好设置已经保存!"
- delegate:nil
- cancelButtonTitle: @"完成"
- otherButtonTitles:nil];
- [alert show];
- }
头文件实现:
- #import <UIKit/UIKit.h>
- @interface ViewController : UIViewController<UIPickerViewDelegate, UIPickerViewDataSource>
- {
- NSMutableArray *aihaoTitles;
- NSMutableArray *aihaoValues;
- NSString *selectedAihao;
- }
- @property (strong, nonatomic) IBOutlet UITextField *username;
- @property (strong, nonatomic) IBOutlet UIPickerView *pickerView;
- @property (strong, nonatomic) IBOutlet UISlider *level;
- - (IBAction)getSettings:(id)sender;
- - (IBAction)setSettings:(id)sender;
- - (IBAction)doneEdit:(id)sender;
- @end
.m文件中其他代码:
- #import "ViewController.h"
- @interface ViewController ()
- @end
- @implementation ViewController
- @synthesize username;
- @synthesize pickerView;
- @synthesize level;
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- aihaoTitles = [[NSMutableArray alloc] init];
- [aihaoTitles addObject:@"足球"];
- [aihaoTitles addObject:@"篮球"];
- [aihaoTitles addObject:@"乒乓球"];
- aihaoValues = [[NSMutableArray alloc] init];
- [aihaoValues addObject:@"football"];
- [aihaoValues addObject:@"basketball"];
- [aihaoValues addObject:@"pingpong"];
- // Do any additional setup after loading the view, typically from a nib.
- }
- - (void)viewDidUnload
- {
- [self setUsername:nil];
- [self setPickerView:nil];
- [self setLevel:nil];
- [super viewDidUnload];
- // Release any retained subviews of the main view.
- }
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
- }
- -(NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView
- {
- return 1;
- }
- -(NSInteger) pickerView:(UIPickerView *)pickerView
- numberOfRowsInComponent:(NSInteger)component
- {
- return [aihaoTitles count];
- }
- -(NSString *) pickerView:(UIPickerView *)pickerView
- titleForRow:(NSInteger)row
- forComponent:(NSInteger)component
- {
- return [aihaoTitles objectAtIndex:row];
- }
- -(void) pickerView:(UIPickerView *)pickerView
- didSelectRow:(NSInteger)row
- inComponent:(NSInteger)component
- {
- selectedAihao = [aihaoTitles objectAtIndex:row];
- }
- - (IBAction)doneEdit:(id)sender{
- }
运行,输入姓名zhongguo 和爱好 足球,选择等级,保存设置。打开设置查看,可以读取到保存后的设置。
这样就可以操作和这只程序的设置项了。
例子代码:http://download.csdn.net/detail/totogo2010/4398462
参考资料:http://blog.csdn.net/totogo2010/
【读书笔记】iOS-iOS开发之iOS程序偏好设置(Settings Bundle)的使用的更多相关文章
- iOS开发之iOS程序偏好设置(Settings Bundle)的使用
目录[-] 1.添加设置项 2.设置的控件 3.编辑设置项的文件 4.在程序中获取Settings 和写入Settings 添加UI 5.实现读取设置和保存代码 在Android手机上, 在某个程序里 ...
- 李洪强iOS开发之iOS社区收集
李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...
- 李洪强iOS开发之iOS好文章收集
李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS多线程开发之NSOperation - 快上车,没时间解释了!
一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...
- 李洪强iOS开发之iOS工具收集
李洪强iOS开发之iOS工具收集 项目 简述 日期 我是怎么慢慢变懒的 : Jenkins + 蒲公英 使用Jenkins + 蒲公英使得项目打包给测试人员自动化,大大节省了劳动力 2015.04.1 ...
- 李洪强iOS开发之iOS学习方法收集
李洪强iOS开发之iOS学习方法收集 在这里收集一些iOS学习方法,会不断更新 项目 简述 日期 一年多iOS开发总结 作者总结了自己一年多的iOS学习经验,对于iOS初学者来说很多地方是可以借鉴的 ...
- 李洪强IOS开发之iOS好项目收集
李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...
- 李洪强iOS开发之iOS技术博客
李洪强iOS开发之iOS技术博客 注意:访问博客请直接点击博客,不要点击后面的RSS地址 博客地址 RSS地址 南峰子的技术博客 剑尖博客 图拉鼎 Henry Lee Dev Talk ...
随机推荐
- Springboot/SpringMvc 读取上传 xls 文件内容
/** * 读取上传 xls 内容返回 * @param file * @return */@RequestMapping(value = "/read.xls")@Respons ...
- preg_match(): Compilation failed: character value in \x{} or \o{} is too large at offset 8
如果用正则筛选中文的时候,需要在规则后面添加字符u,表示使用utf8编码去解析 $reg = '/[\x{4e00}-\x{9fa5}]/u'; 例如: $reg = '/[\x{4e00}-\x{9 ...
- FTPClient 中 FTPClient.changeWorkingDirectory(filePath) 代码一直返回 false
FTP文件下载需要的jar包: commons-net-2.0.jar 有时可能还需要:jakarta-oro.jar 参考:FTPClient参考文档 这里记录下我碰到的问题: 刚开始我的账号和密 ...
- 使用 PLSQL 连接 Oracle9i 数据库
昨天用了Navicate连接Oracle数据库,不停的掉线,然后死机,只能重启Navicate,没办法,还是用回plsql吧,重装了一遍(之前重装系统后,电脑自带的公司原有的软件没啦) 先安装了Ora ...
- 第四篇:断路器(Hystrix)
一.断路器简介. 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证 ...
- $.parseJson()定义和用法
$.parseJSON() 函数用于将符合标准格式的的JSON字符串转为与之对应的JavaScript对象. 例子: 这里首先给出JSON字符串集,字符串集如下: var data=" { ...
- Excel透视技巧-三级分类统计名单、分类统计数据
Excel透视技巧-三级分类统计名单.分类统计数据 基础数据 透视表1--三级分类统计名单 透视表2-分类统计数据
- kdump内核转储
目录 CentOS 7.5 配置Kdump 安装Kdump 安装Kdump图形化 配置保留内存 配置kdump类型 核心转储到本地 核心转储到设备 使用NFS指定核心转储 使用SSH指定核心转储 配置 ...
- 解决 "Script Error" 的另类思路
本文由小芭乐发表 前端的同学如果用 window.onerror 事件做过监控,应该知道,跨域的脚本会给出 "Script Error." 提示,拿不到具体的错误信息和堆栈信息. ...
- Kafka的通讯协议
Kafka的通讯协议 标签:kafka Kafka的Producer.Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议.Kafka的这套协议完全是为了Kafka自身的业务需求 ...