iPhone应用程序编程指南(应用程序偏好设置)

为了将定制的应用程序偏好设置集成到Settings程序中,您必须在应用程序包的顶级目录中包含一个特殊格式的Settings程序包,由它负责将应用程序的偏好设置信息提供给Settings程序,而Settings程序则负责对其进行显示,并将用户提供的值写入偏好设置数据库。

偏好设置的指导原则

将偏好设置加入到Settings程序的做法最适合于效率工具类型的应用程序,以及偏好设置值配置完成后很少再改变的程序。

请注意:永远不要使偏好设置同时存在于Setting程序和自定义的应用程序屏幕上。举例来说,如果工具类应用程序在主视图的背面有偏好设置,则在Settings程序中就不应该再有可配置的设置。如果您的应用程序需要进行偏好设置,则请仅选择和使用一种方案。

偏好设置的接口

您显示的每一个偏好设置都必须具有特定的类型。偏好设置的类型定义了Settings程序如何对其进行显示。大多数偏好设置类型都和某种类型的、用于进行设置的控件相关联,而另外一些类型则提供一种偏好设置的组织方式。表9-1列出了Settings程序支持的各种元素类型,以及如何用这些类型来实现自己的偏好设置页面。

表 9-1  偏好设置元素的类型

元素类型

描述

文本框

文本框类型显示一个可选的标题和一个可编辑的文本输入框,适用于需要用户输入自定义字符串的偏好设置。

这个类型的键是PSTextFieldSpecifier

标题

标题类型显示一个只读的字符串,适用于显示只读字符串的偏好设置(如果偏好设置包含隐含或非直接的值,这个类型可以将可能的值映射为字符串)。

这个类型的键是PSTitleValueSpecifier

拨动开关

拨动开关类型显示一个ON/OFF拨动按键,适用于配置值为二选一的偏好设置。这个类型通常用于表示包含布尔值的偏好设置,但也可以用于表示包含非布尔值的偏好设置。

这个类型的键是PSToggleSwitchSpecifier

滑块

滑块类型显示一个滑块控件,适用于值为一个范围的偏好设置。这个类型的值是一个实数,值的最小和最大值由您来指定。

这个类型的键是PSSliderSpecifier

值列表

值列表类型使用户可以从一个值的列表中选择其一,适用于支持多个互斥值的偏好设置,这些值的类型可以是任意的。

这个类型的键是PSMultiValueSpecifier

组类型使您可以将几组不同的偏好设置组织到一个页面上。组类型并不表示一个可配置的偏好设置,而只是包含一个标题字符串,显示在一或多个可配置的偏好设置之前。

这个类型的键是PSGroupSpecifier

子页面

子页面类型使用户可以访问新的偏好设置页面,适用于实现多层次的偏好设置。有关如何配置和使用这个类型的更多信息,请参见“多层次的偏好设置” 。这个类型的键是 PSChildPaneSpecifier

 

  Settings程序包

在iPhone OS中,开发者通过一种特殊的Settings程序包来指定应用程序的偏好设置,这种程序包命名为Settings.bundle,驻留在应用程序程序包的顶级目录上。该程序包中包含一或多个Settings页面文件,用于定义应用程序偏好设置的详细信息;还可以包含显示偏好设置需要的其它支持文件,比如图像或本地化文件。表9-2列出了一个典型Settings程序包的内容。

表9-2  Settings.bundle目录下的内容

项目名称

描述

Root.plist

这个Settings页面文件包含根页面的偏好设置,它的内容在“Settings页面文件的格式” 部分有更详细的描述。

其它.plist文件

如果您需要通过多个子面板来构建一组有层次结构的偏好设置,则每个子面板的内容都分别存储在不同的Settings页面文件中。您需要负责命名这些文件,并将它们关联到正确的子面板上。

一或多个.lproj 目录

这些目录用于存储Settings页面文件的本地化字符串资源。每个目录都包含一个字符串文件,文件的标题在Settings页面中指定。这些字符串文件为偏好设置提供可以直接显示给用户的本地化内容。

其它图像

如果您使用滑块控件,则可以将滑块的图像存储在程序包的顶级目录下。

除了装载程序包的Root.plist页面文件之外,Settings程序还会在必要时装载与该文件相关联的语言资源。每个Settings页面文件都可以有一个关联的.strings文件,用于包含可见字符串的本地化值。在准备显示偏好设置信息时,Settings程序会根据用户偏好的语言来寻找相应的字符串资源,并在显示之前替换偏好设置页面中对应的内容。

Settings页面文件的格式

Settings程序包中的每个Settings页面文件都以iPhone设置属性列表的文件格式(它是一种结构化的文件格式)进行存储。编辑Settings页面文件的最简单方法,就是使用Xcode内置的编辑器组件,具体做法请参见“为Settings页面的编辑做准备”部分;您也可以用属性列表编辑器程序来进行编辑,它是Xcode的工具之一。

请注意:在连编时,Xcode会将工程中基于XML的属性文件自动转换为二进制格式,转换过程是连编时自动完成的,目的是节省磁盘空间。

每个Settings页面文件的根元素都包含表9-3列出的键。事实上,只有一个键是必须的,但我们推荐包含所有的两个键。

表9-3 Settings页面文件中的根键

类型

PreferenceSpecifiers(必须包含)

数组

这个键的值是一个字典数组,数组中的每个字典都包含一个偏好设置元素的信息。有关元素类型列表请参见表9-1,与元素类型相关联的键的描述,则请参见Settings程序的结构参考

StringsTable

字符串

和这个页面文件相关联的字符串文件的名称。程序包中专用于语言的工程目录应该包含这个字符串文件的一个拷贝(带有相应的本地化字符串)。如果您没有包含这个键,则表示页面文件中的字符串没有被本地化。有关如何使用这些字符串的信息,请参见“本地化资源”部分。

多层次的偏好设置

如果您希望以一定的层次结构组织偏好设置,则您定义的每个页面都必须有它自己的.plist文件,每个.plist文件包含一组仅在该页面显示的偏好设置。应用程序偏好设置的主页面总是存储在Root.plist文件中,其它页面则可以根据自己的喜好进行命名。

为了建立父子页面之间的连接,您需要在父页面中包含一个子面板元素。子面板元素负责占据一行,在用户触击时显示一个新的设置Settings页面。子面板元素的File键标识一个.plist文件的名称,该文件负责定义子页面的内容;Title键则标识子页面的标题,该标题也作为子面板元素行的文本。Settings程序会自动提供子页面的漫游控制,使用户可以回到父页面。

图9-1展示了一组多层次的页面是如何工作的。图的左边显示了.plist文件,右边则显示各个页面之间的关系。

图9-1  用子面板组织偏好设置

Organizing preferences using child panes

 

本地化资源

由于偏好设置中包含用户可见的字符串,所以您应该在Settings程序包中为那些字符串提供本地化版本。对于程序包支持的每种本地化语言,偏好设置页面都可以有一个.strings文件与之对应。当Settings程序碰到一个支持本地化的键时,就会在相应本地化版本的.strings文件中寻找匹配的键,如果找到了,就显示与之关联的值。

 

添加和修改Settings程序包

访问您的偏好设置

程序清单9-1展示一个如何在应用程序中读取偏好设置的简单实例,例子中通过NSUserDefaults类取得一个在“配置一个Settings页面:一个教程”部分中创建的偏好设置值,并将它赋值给应用程序的一个实例变量。

程序清单9-1  访问应用程序偏好设置的值

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [self setShouldPlaySounds:[defaults boolForKey:play_sounds_preference]];
 
    // Finish app initialization...
}

在仿真器中调试应用程序的偏好设置

在运行您的应用程序时,iPhone Simulator会将所有偏好设置的值保存在~/Library/Application Support/iPhone Simulator/User/Applications/<APP_ID>/Library/Preferences目录下,这里的<APP_ID>是一个由程序生成的目录名,iPhone OS用它来标识您的应用程序。

每次重新安装应用程序时,iPhone OS都会执行一次干净的安装,将之前所有的偏好设置删除。换句话说,在Xcode中连编或运行应用程序会导致老版本的所有内容被新版本所代替。如果您要测试应用程序在两次运行之间偏好设置发生的变化,则必须直接从仿真器界面上运行,而不应该通过Xcode运行。

 

 

posted @ 2012-02-15 18:33  Piosa  阅读(1128)  评论(0编辑  收藏  举报