在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. Android开发 - 掌握ConstraintLayout(三)编辑器

    从本篇博客开始我们开始介绍如何使用ConstraintLayout. 既然ConstraintLayout叫约束布局,首先我们先介绍什么叫约束(Constraints): 约束(Constraints ...

  2. es2017新特性

    2017年6月底es2017不期而至; 截止目前es8是ecmascript规范的第九个版本:自es2015开始ECMA协会将每年发布一个版本并将年号作为版本号:算了 直接看下es2017的新特性: ...

  3. Burpsuite常用模块详解以及渗透测试上的运用

    0x00前言 哪有什么前言,大家好,我是浅安.QQ:320229344... 0x01 JDK的安装,以及Burpsuite的成功开启. burpsuite基于JAVA环境才能正常运行的.所以要先安装 ...

  4. 使用new Image()进行预加载

    概述 这篇博文记录了用new Image()进行预加载的总结,供以后开发时参考,相信对其他人也有用. 旧的预加载 一般我们为了让背景图更快的加载,我们常常把背景图放在一个display:none的im ...

  5. 跨浏览器的javascript事件的封装

    一,跨浏览器的事件处理程序 1,DOM0级处理事件 将一个函数赋值给一个事件处理程序属性. 事件流:冒泡阶段. 使用: 为元素增加事件: var btn = document.getElementBy ...

  6. 移动端h5页面的那些坑

    最近一直在写移动端页面,由于之前写移动端写的比较少,所以此次踩过许多坑.特此总结一下: 1.<input type='button'>背景色在ios中的兼容性,颜色发白 解决办法:在全局样 ...

  7. 使用node.js如何爬取网站数据

    数据库又不会弄,只能扒扒别人的数据了. 搭建环境: (1).创建一个文件夹,进入并初始化一个package.json文件.  npm init -y (2).安装相关依赖:  npm install ...

  8. PyTorch(二)Intermediate

    Convolutional Neural Network import torch import torch.nn as nn import torchvision import torchvisio ...

  9. LeetCode--No.012 Integer to Roman

    12. Integer to Roman Total Accepted: 71315 Total Submissions: 176625 Difficulty: Medium Given an int ...

  10. python 旋转数组 多种解题思路

    leetcode 题目描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 要求使用空间复杂度为 O(1) 的 ...