IOS – 添加Settings Bundle应用程序首选项到Settings应用程序

iPhone允许应用程序将自定义首选项添加到Settings应用程序中,开发者也可以以编程的方式指定这些设置,但添加到Settings应用程序的方式会提供一个友好的GUI。自定义首选项支持多种多样的数据交互风格,包括文本、密码、开关、滑块、以及二级选择页面。但这里应注意避免敏感信息。

IOS应用程序存储信息的方式主要有三种:

1. 单例类NSUserDefaults:NSUserDefaults类的工作原理类似于NSDictionary,所有首选项都以键/值对的方式存储在NSUserDefaults单例中。

2. 设置束(Settings Bundle):提供了一个通过iOS应用程序Settings对应用程序进行配置的接口。

3. 直接访问文件系统:能够读取属于当前应用程序的iOS文件系统部分的文件。常见的如数据库文件。

设置束也是对一个plist文件进行编辑,它的优点在于,可以通过Xcode plist编辑器来操作,无需额外编写代码,只需要在编辑器里定义要存储的数据及其键即可。

创建设置首选项菜单的步骤如下:

1.New File…,选择Resource,选择Settings Bundle,创建一个Settings.bundle文件,默认名称即可。建议添加到Supporting Files分组里。

2.打开项目窗口的Settings.bundle项,应该看到Root.plist和en.lproj文件,其中en.lproj是关于设置束国际化的文件,暂时不考虑。打开Root.plist文件,这个文件本质上就是字典,是以键值对来存储和操作的。

3.Root.plist文件中的节点的类型有:Boolean、Data、Date、Number、String(基本的类型);Dictionary和Array(能够包含其他节点的类型)。

4.在Root.plist中设置属性列表的时候要遵循特定格式。我们能够操作的地方在Preference Items数组(类型为Array)里,请删除或修改此项里面的默认项,如果有的话。正常情况下应爱是有四个子项的分别为分组、输入框、开关、滑块(我的Xcode版本为6.3.2)。但请注意,Preference Items项的(直接)子项只能够是Dictionary类型的。

设置束中的文件Root.plist决定了应用程序首选项如何呈现在应用程序Settings中。有7种类型的首选项,分别为:

Text Field:文本框。键为PSTextFieldSpecifier,可编辑的文本字符串。常用于保存用户自定义的信息,如昵称等。

Title:标题。键为PSTitleValueSpecifier,只读文本字符串。常用于显示不变的信息,如版本信息。

Toggle Switch:开关。键为PSToggleSwitchSpecifier,开关按钮。

Slider:滑块。键为PSSliderSpecifier,取值位于特定范围内的滑块。

Multi value:多值。键为PSMultiValueSpecifier,下拉式列表。

Group:编组。键为PSGroupSpecifier,首选项逻辑编组的标题。常用于设置项的分组。

Child Pane:子窗格。键为PSChildPaneSpecifier,子首选项页。常用于选项比较多的选择菜单。

小窍门:

当前Xcode版本中,可以快速创建各菜单项。单击菜单项的键列,会弹出快捷创建项的菜单。选择想要的类型即可自动创建部分键值对,然后略做修改即可。

下面开始介绍各种菜单的用法:

1.Text Field:文本框。文本框可选的键有如下几个:

Autocapitalization Style:自动大写。有四个值: None(无)、Sentences(句子首字母大写)、Words(单词首字母大写)、All Characters(所有字母大写)。

Autocorrection Style:自动纠正拼写,如果开启,你输入一个不存在的单词,系统会划红线提示。有三个值:Default(默认)、No Autocorrection(不自动纠正)、Autocorrection(自动纠正)。

Default Value:默认值。注意,包括其他菜单的Default Value,只是默认的值,一旦用户直接或间接更改,Default Value不再作用,此后显示或获取的都只是用户最新设置的值。

Identifier:设置项标示,用于在程序中获取设置项的值的键Key。

Keyboard Type:键盘样式。有五个值:Alphabet(字母表,默认)、Numbers and Punctuation(数字和标点符号)、Number Pad(数字面板)、URL(比Alphabet多出了.com等域名后缀)、Email Address(比Alphabet多出了“@”符号)。

Text Field Is Secure:是否为安全文本(密码)。如果设置为YES,则内容以圆点符号出现。

Title:提示文本。用于在你的文本框前提示文本框的内容。

Type:设置文本框的话,这个只能选Text Field。

设置完成后,你的文本框项可能是这样的:

2.Title:标题。标题可选的键有如下几个:

Default Value:默认值。这个会显示在设置项的右方,灰色字体。

Identifier、Title同上。

Titles和Values:用于指定Default Value的可选值,如分别在Titles和Values下各设置5个值,这时可以指定Default Value为Values里的一个值,这时会在设置里显示Titles里相应的项。Titles和Values中,显示时只显示对应的Title,取值时只获取到对应的Value。注意通过代码修改这个Title对应的Value时,要确认值包含在Values。 注意这里的Titles和Values项,不会在Settings页面中生成一个子级设置页面供选择Value。

Type:设置标题的话,这个只能选Title。

设置完成后,你的标题项可能是这样的:

3.Toggle Switch:开关按钮。开关项可选的键有如下几个:

Default Value:默认值。

Identifier、Title同上。

Type:设置开关的话,这个只能选Toggle Switch。

Value for ON和Value for OFF:设置开关状态对应的值。

设置完成后,你的开关项可能是这样的:

4.Slider:滑块。滑块项可选的键有如下几个:

Default Value、Identifier同上。

Minimum Value、Maximum Value:最小值和最大值。

Min Value Image Filename、Max Value Image Filename:在滑动条左右显示的图片。图片大小必须为21*21,并且要放在Settings.bundle包内(在Finder里显示包内容,然后粘贴)。

Type:设置滑块的话,这个只能选Slider。

设置完成后,你的滑块项可能是这样的:

5.Multi value:多值。多值项可选的键有如下几个:

Default Value:默认值。

Identifier、Title同上。

Type:设置开关的话,这个只能选Multi Value。

Titles和Values:基本同上,但这个多值的Titles和Values会在Settings页面中生成一个子级设置页面供选择Value。

6.Group:分组。

如果你要在首选项里面添加分组的话,那么请使用Group:建立一个Preference Items的子项(如:“Item 0”),类型为“Dictionary”,并且包含两个类型为“String”子项,名称分别为:“Type”和“Title”,值分别为:“Group”和“GroupName”(GroupName是你自定义的组名,可以任意的名字)。注意,分组直到遇到下一个同级的指示分组的项结束,或者遇到同级最后一项时结束。

设置完成后,你的fe项可能是这样的:

7.Child Pane:子窗格。这个可以定义一个二级菜单,可选的键有三个:

Type:创建子窗格必选Child Pane。

Title:标题,在应用程序首选项菜单中父页显示的标题。

Filename:指定子窗格菜单对应的plist文件,类似于默认的Root.plist。这个项填写时不要带后缀名。另外这个文件要和Root.plist文件放到一起。右键Root.plist文件,选择Show in Finder。然后在Finder窗口中右键Root.plist文件选择复制。默认会复制到当前目录下一个Root.plist的副本。接着修改一个有意义的名字即可(这里改成Child.plist)。然后编辑Child.plist文件,右键Child.plist的根项目,选择Property List Type里的iPhone Settings plist。这样再编辑这个文件时,就会有自动提示了。

Child.plist文件的StringsTable这一项可有可无,建议保留,并修改键为Strings Filename(和Root.plist中相同),值为其文件名,这里是Child,不要带文件后缀。

设计设置菜单项就这么多吧。这些Setting的数据将存储在NSUserDefaults中StandardDefaults当中,每个设置对应的identifier就是Key。然后只需要按NSUserDefaults的操作方式操作设置项就行了。

下面贴出一段获取设置项的代码:

 1 - (void)readingSettingsPreference
 2 {
 3     //获取Settings.bundle路径
 4     NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
 5
 6     if(!settingsBundle)
 7     {
 8         NSLog(@"找不到Settings.bundle文件");
 9         return;
10     }
11
12     //读取Settings.bundle里面的配置信息
13     NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
14     NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];
15     NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
16
17     for(NSDictionary *prefSpecification in preferences)
18     {
19         NSString *key = [prefSpecification objectForKey:@"Key"];
20         if(key)
21         {
22             [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
23         }
24     }
25
26     [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
27
28     [[NSUserDefaults standardUserDefaults] synchronize];
29
30     //TODO:读取指定数据
31
32 }
时间: 2024-10-06 03:09:37

IOS – 添加Settings Bundle应用程序首选项到Settings应用程序的相关文章

Xamarin.Android学习之应用程序首选项

一.前言 任何App都会存在设置界面,如果开发者利用普通控件并绑定监听事件保存设置,这一过程会非常的枯燥,而且耗时.我们可以看到Android系统的设置界面里面的选项如此之多,是不是都是这样开发的呢?其实不然,Android已经给我们提供了专门设计这一功能的技术,叫应用程序首选项,今天我们将学习如何使用他们来开发配置界面以及功能. 二.准备工作 首先需要理解的就是我们设置界面还是需要控件的,但是我们所使用的控件不在是普通的控件,下面我们来简单的介绍下我们需要知道的控件. CheckBoxPref

iOS项目开发实战——使用用户首选项数据API存储信息

开发过Android的同学都知道,在Android中四大组件之一的Content Provider,这是一种轻量级的数据存储组件,可以存储一些简单地配置信息或者用户信息.比如最常用的地方就是记住用户名密码,使用户下次打开应用的时候可以不再输入,方便操作.来到iOS中,苹果也提供了类似功能的API--用户首选项数据,用于存储简单的用户配置信息.实用.方便.高效.具体实现步骤如下: (1)在Main.storyboard中拖入一个输入文本框TextView和保存按钮Button,等下要把文本框中的内

我的Android 4 学习系列之文件、保存状态和首选项

目录 使用Shared Preference 保留简单的应用程序数据 保存回话间的Activity实例数据 管理应用程序首选项和创建Preference Screen 保存并加载文件以及管理本地文件系统 将静态文件作为外部资源添加 使用Shared Preference 保留简单的应用程序数据 Shared Prefrence 是一种简单的.轻量级的名/值对(NVP)机制,用于保存原始应用程序数据,最常见的是用户的应用程序首选项. Android 中的数据持久化技术为平衡速度.效率和健壮性提供了

iOS之Settings.Bundle的应用

Settings.Bundle Settings.Bundle支持六种配置项分别是:Title,MultiValue,Group,Slider,ToggleSwitch,TextField . Title Type:配置类型,默认是TitleTitle:配置项显示的TitleIdentifier: 配置项的标识符,用来获取配置项的配置内容Default Value :配置项默认值 MultiValue Type:配置类型,默认Multi Value Title:配置项显示的标题Identifie

Eclipse插件开发学习笔记【7】--- 添加首选项

首先,我们新建一个插件项目,打开plugin.xml文件选择扩展选项卡,添加一个org.eclipse.ui.preferencePages扩展点,并再添加一个page按照图中所示配置,注意第二个page的category为第一个page的id. 右键src文件夹,点击新建类,新建2个类分别为Page1,Page2,继承PreferencePage类,实现IWorkbenchPreferencePage接口. /** * * Page1 * */ package addpreferencepag

IOS编程教程(八):在你的应用程序添加启动画面

IOS编程教程(八):在你的应用程序添加启动画面 虽然你可能认为你需要编写闪屏的代码,苹果已经可以非常轻松地把它做在Xcode中.不需要任何编码.你只需要做的是设置一些配置. 什么是闪屏 对于那些新学代码的人,可能没有听说过“闪屏”把,让我先作一个简单的解释.闪屏是常见于iOS应用程序,以及其他桌面应用程序.这是你启动一个应用程序时,你看到的第一个画面.通常情况下,初始屏幕是一个覆盖整个屏幕的图像,消失后加载主屏幕.下图显示了几种闪屏: 简单闪屏(开始页面) 闪屏的主要目的是为了让用户知道你的程

iOS的settings bundle中开关button(Toggle Switch)取不到值的问题

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 在Xcode7.2中设置App的settings bundle时发现当bundle元素类型为Toggle Switch时,在App里取不到其变化值. 当中Toggle Switch设置例如以下: 在代码中以例如以下方式读取其值: BOOL isWarp = [defaults boolForKey:kWarpDrive]; _warpDriveLabel.te

转:Android preference首选项框架

详解Android首选项框架ListPreference 探索首选项框架 在 深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写一个应用程序,它提供了一个搜索 飞机航班的工具.而且,假设该应用程序的默认设置是根据机票价格由低到高的顺序显示航班,但用户可以将首选项设置为始终根据最少停站数或特定航线来航班. 如何实现这一场景? ListPreference 显 然,必须为用户提供UI 来查看排序选项列表.该列表将包含每个选项的单选按钮,

整合Settings.bundle显示版本信息

本文转载至 http://www.cocoachina.com/ios/20141103/10112.html iOS开发XCode版本管理Debug开发Tips 现在你有一个App,你同事的iPad用着用着出了点故障,Boss也说他的iPhone出了点问题,然后…你还有一些测试设备要跑…… 然后呢,这些设备都扔到了你这个苦逼程序员的手中善后,不过现在有个问题…你需要确认这些不同的设备都装了哪个该死的版本…是昨天弄个的TestFlight版本呢…还是上个星期在AppStore上发布的版本…或者是