在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里,用源代码打开方式就可以编辑了。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5. <key>PreferenceSpecifiers</key>
  6. <array>
  7. <dict>
  8. <key>Type</key>
  9. <string>PSGroupSpecifier</string>
  10. <key>Title</key>
  11. <string>个人信息</string>
  12. <key>Key</key>
  13. <string></string>
  14. </dict>
  15. <dict>
  16. <key>Type</key>
  17. <string>PSTextFieldSpecifier</string>
  18. <key>Title</key>
  19. <string>姓名</string>
  20. <key>Key</key>
  21. <string>username</string>
  22. </dict>
  23. <dict>
  24. <key>Type</key>
  25. <string>PSMultiValueSpecifier</string>
  26. <key>Values</key>
  27. <array>
  28. <string>football</string>
  29. <string>basketball</string>
  30. <string>pingpong</string>
  31. </array>
  32. <key>Title</key>
  33. <string>爱好</string>
  34. <key>Titles</key>
  35. <array>
  36. <string>足球</string>
  37. <string>篮球</string>
  38. <string>乒乓球</string>
  39. </array>
  40. <key>Key</key>
  41. <string>aihao</string>
  42. <key>DefaultValue</key>
  43. <string>football</string>
  44. </dict>
  45. <dict>
  46. <key>FalseValue</key>
  47. <string>NO</string>
  48. <key>TrueValue</key>
  49. <true/>
  50. <key>DefaultValue</key>
  51. <false/>
  52. <key>Type</key>
  53. <string>PSToggleSwitchSpecifier</string>
  54. <key>Title</key>
  55. <string>婚姻状况</string>
  56. <key>Key</key>
  57. <string>maritalStatus</string>
  58. </dict>
  59. <dict>
  60. <key>Type</key>
  61. <string>PSGroupSpecifier</string>
  62. <key>Title</key>
  63. <string>等级</string>
  64. <key>Key</key>
  65. <string></string>
  66. </dict>
  67. <dict>
  68. <key>DefaultValue</key>
  69. <integer>5</integer>
  70. <key>MaximumValue</key>
  71. <integer>10</integer>
  72. <key>MinimumValue</key>
  73. <integer>1</integer>
  74. <key>Type</key>
  75. <string>PSSliderSpecifier</string>
  76. <key>Title</key>
  77. <string>等级</string>
  78. <key>Key</key>
  79. <string>levelState</string>
  80. </dict>
  81. </array>
  82. <key>StringsTable</key>
  83. <string>Root</string>
  84. </dict>
  85. </plist>

这时候运行,在来到设置项看:

已经是我们自己设置的效果了。

4、在程序中获取Settings 和写入Settings 添加UI

这里的项目是设置好了,那怎么读取呢?我们先在程序里添加一些对应的UI.打开.xib文件,往里放置控件,并生成对应的映射和Action。

pickerView的使用请参考iOS学习之UIPickerView控件的简单使用这篇文章。

5、实现读取设置和保存代码

关键是通过: NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];

代码获取设置项的NSUserDefaults值,然后通过key获取设置的内容和保存设置内容

在两个Button的按下事件实现如下:

  1. - (IBAction)getSettings:(id)sender {
  2. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  3. username.text =  [defaults objectForKey:@"username"];
  4. selectedAihao = [defaults objectForKey:@"aihao"];
  5. NSLog(@"aihao:%@",selectedAihao);
  6. NSInteger aihaoIndex = [aihaoValues indexOfObject:selectedAihao];
  7. [pickerView selectRow:aihaoIndex inComponent:0 animated:YES];
  8. [level setValue:[defaults integerForKey:@"levelState"]];
  9. }
  10. - (IBAction)setSettings:(id)sender {
  11. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  12. [defaults setValue:username.text forKey:@"username"];
  13. NSInteger aihaoIndex = [aihaoTitles indexOfObject:selectedAihao];
  14. [defaults setValue:[aihaoValues  objectAtIndex:aihaoIndex] forKey:@"aihao"];
  15. [defaults setInteger:level.value forKey:@"levelState"];
  16. UIAlertView *alert = [[UIAlertView alloc]
  17. initWithTitle:@"偏好设置"
  18. message:@"偏好设置已经保存!"
  19. delegate:nil
  20. cancelButtonTitle: @"完成"
  21. otherButtonTitles:nil];
  22. [alert show];
  23. }

头文件实现:

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController<UIPickerViewDelegate, UIPickerViewDataSource>
  3. {
  4. NSMutableArray *aihaoTitles;
  5. NSMutableArray *aihaoValues;
  6. NSString *selectedAihao;
  7. }
  8. @property (strong, nonatomic) IBOutlet UITextField *username;
  9. @property (strong, nonatomic) IBOutlet UIPickerView *pickerView;
  10. @property (strong, nonatomic) IBOutlet UISlider *level;
  11. - (IBAction)getSettings:(id)sender;
  12. - (IBAction)setSettings:(id)sender;
  13. - (IBAction)doneEdit:(id)sender;
  14. @end

.m文件中其他代码:

  1. #import "ViewController.h"
  2. @interface ViewController ()
  3. @end
  4. @implementation ViewController
  5. @synthesize username;
  6. @synthesize pickerView;
  7. @synthesize level;
  8. - (void)viewDidLoad
  9. {
  10. [super viewDidLoad];
  11. aihaoTitles = [[NSMutableArray alloc] init];
  12. [aihaoTitles addObject:@"足球"];
  13. [aihaoTitles addObject:@"篮球"];
  14. [aihaoTitles addObject:@"乒乓球"];
  15. aihaoValues = [[NSMutableArray alloc] init];
  16. [aihaoValues addObject:@"football"];
  17. [aihaoValues addObject:@"basketball"];
  18. [aihaoValues addObject:@"pingpong"];
  19. // Do any additional setup after loading the view, typically from a nib.
  20. }
  21. - (void)viewDidUnload
  22. {
  23. [self setUsername:nil];
  24. [self setPickerView:nil];
  25. [self setLevel:nil];
  26. [super viewDidUnload];
  27. // Release any retained subviews of the main view.
  28. }
  29. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  30. {
  31. return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  32. }
  33. -(NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView
  34. {
  35. return 1;
  36. }
  37. -(NSInteger) pickerView:(UIPickerView *)pickerView
  38. numberOfRowsInComponent:(NSInteger)component
  39. {
  40. return [aihaoTitles count];
  41. }
  42. -(NSString *) pickerView:(UIPickerView *)pickerView
  43. titleForRow:(NSInteger)row
  44. forComponent:(NSInteger)component
  45. {
  46. return [aihaoTitles objectAtIndex:row];
  47. }
  48. -(void) pickerView:(UIPickerView *)pickerView
  49. didSelectRow:(NSInteger)row
  50. inComponent:(NSInteger)component
  51. {
  52. selectedAihao = [aihaoTitles objectAtIndex:row];
  53. }
  54. - (IBAction)doneEdit:(id)sender{
  55. }

运行,输入姓名zhongguo 和爱好 足球,选择等级,保存设置。打开设置查看,可以读取到保存后的设置。

这样就可以操作和这只程序的设置项了。

例子代码:http://download.csdn.net/detail/totogo2010/4398462

参考资料:http://blog.csdn.net/totogo2010/

 

【读书笔记】iOS-iOS开发之iOS程序偏好设置(Settings Bundle)的使用的更多相关文章

  1. iOS开发之iOS程序偏好设置(Settings Bundle)的使用

    目录[-] 1.添加设置项 2.设置的控件 3.编辑设置项的文件 4.在程序中获取Settings 和写入Settings 添加UI 5.实现读取设置和保存代码 在Android手机上, 在某个程序里 ...

  2. 李洪强iOS开发之iOS社区收集

    李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...

  3. 李洪强iOS开发之iOS好文章收集

    李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...

  4. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  5. iOS多线程开发之NSOperation - 快上车,没时间解释了!

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  6. 李洪强iOS开发之iOS工具收集

    李洪强iOS开发之iOS工具收集 项目 简述 日期 我是怎么慢慢变懒的 : Jenkins + 蒲公英 使用Jenkins + 蒲公英使得项目打包给测试人员自动化,大大节省了劳动力 2015.04.1 ...

  7. 李洪强iOS开发之iOS学习方法收集

    李洪强iOS开发之iOS学习方法收集 在这里收集一些iOS学习方法,会不断更新 项目 简述 日期 一年多iOS开发总结 作者总结了自己一年多的iOS学习经验,对于iOS初学者来说很多地方是可以借鉴的 ...

  8. 李洪强IOS开发之iOS好项目收集

    李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...

  9. 李洪强iOS开发之iOS技术博客

    李洪强iOS开发之iOS技术博客 注意:访问博客请直接点击博客,不要点击后面的RSS地址 博客地址 RSS地址 南峰子的技术博客   剑尖博客   图拉鼎   Henry Lee   Dev Talk ...

随机推荐

  1. Springboot/SpringMvc 读取上传 xls 文件内容

    /** * 读取上传 xls 内容返回 * @param file * @return */@RequestMapping(value = "/read.xls")@Respons ...

  2. 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 ...

  3. FTPClient 中 FTPClient.changeWorkingDirectory(filePath) 代码一直返回 false

    FTP文件下载需要的jar包: commons-net-2.0.jar  有时可能还需要:jakarta-oro.jar 参考:FTPClient参考文档 这里记录下我碰到的问题: 刚开始我的账号和密 ...

  4. 使用 PLSQL 连接 Oracle9i 数据库

    昨天用了Navicate连接Oracle数据库,不停的掉线,然后死机,只能重启Navicate,没办法,还是用回plsql吧,重装了一遍(之前重装系统后,电脑自带的公司原有的软件没啦) 先安装了Ora ...

  5. 第四篇:断路器(Hystrix)

    一.断路器简介. 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证 ...

  6. $.parseJson()定义和用法

    $.parseJSON() 函数用于将符合标准格式的的JSON字符串转为与之对应的JavaScript对象. 例子: 这里首先给出JSON字符串集,字符串集如下: var data="  { ...

  7. Excel透视技巧-三级分类统计名单、分类统计数据

    Excel透视技巧-三级分类统计名单.分类统计数据 基础数据 透视表1--三级分类统计名单 透视表2-分类统计数据

  8. kdump内核转储

    目录 CentOS 7.5 配置Kdump 安装Kdump 安装Kdump图形化 配置保留内存 配置kdump类型 核心转储到本地 核心转储到设备 使用NFS指定核心转储 使用SSH指定核心转储 配置 ...

  9. 解决 "Script Error" 的另类思路

    本文由小芭乐发表 前端的同学如果用 window.onerror 事件做过监控,应该知道,跨域的脚本会给出 "Script Error." 提示,拿不到具体的错误信息和堆栈信息. ...

  10. Kafka的通讯协议

    Kafka的通讯协议 标签:kafka Kafka的Producer.Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议.Kafka的这套协议完全是为了Kafka自身的业务需求 ...