本节将为Homepwner应用创建一个设置束,用户可以在设置应用中找到Homepwner的用户偏好设置列表,并将NextItemName由”Coffee Cup“修改为其他常用值(见图26-1)。
图26-1 Homepwner的设置束
虽然可以通过设置束向设置应用注册用户偏好设置,但是,大多数第三方应用并没有采用这种方式。这是因为直接使用应用自身的界面会更方便。相反,如果使用设置应用,那么用户需要先回到主屏幕,启动设置应用,修改之后再重新回到应用。
如果读者确定要借助设置应用修改用户偏好设置,就需要先为应用创建一个设置束,”设置束“听起来很复杂,实际上它只是一个包含设置界面描述文件的目录。设置界面描述文件同样也是plist文件,设置应用通过该文件创建界面中的各项用户偏好设置,以及每项设置所使用的UI控件。除此之外,如果需要对应用实施本地化,还可以向设置束中添加包含本地化字符串(例如图26-1中的Default Item Name)的Root.strings文件。
下面在应用中创建一个新设置束。首先在Xcode的File菜单中选择New→File…,然后在iOS部分选择Resources,最后在右侧区域选择Settings Bundle(见图26-2)。
图26-2 Homepwner的设置束
在下一个面板中,使用默认文件名,点击create创建设置束。这时,项目中会出现一个Settings.bundle目录,目录中包含一个Root.plist文件和一个en.lproj子目录。首先介绍Root.plist文件。
编辑Root.plist
Root.plist描述了应用的设置界面,它包含一组字典,每一个字典必须含有一个Type(类型)键,表示一个特定的视图。它主要包括以下几种:
PSChildPaneSpecifier用于创建子一级界面,类似于将子视图控制器压入导航控制器栈
请读者先阅读默认的Root.plist,然后构建并运行应用。当Homepwner启动后,切换到设置应用,找到并查看Homepwner的设置界面。
接下来返回Xcode,打开Root.plist,删除多余的用户偏好设置,只保留一个数组,该数组中只包含一个文本框。对文本框进行以下设置:
•设置Identifier为NextItemName,作为该项用户偏好设置的键。
•设置DefaultValue为Coffee Cup,如果NSUserDefaults中没有设置该项用户偏好设置,就使用该默认值。
•设置Title为NextItemName,用于在Root.strings文件中查找对应的本地化字符串。
这时Root.plist应该类似于图26-3。
图26-3 Root.plist
实际上,修改Root.plist就是在不编写任何代码或创建视图的情况下对设置应用中的界面进行布局。设置应用会根据Root.plist自动为应用创建设置界面,包括创建视图控制器和所有视图。
如果读者在创建设置束时遇到了问题,则可以参考Apple提供的Settings Application Schema Reference(设置应用格式规范参考),其中列举了Root.plist所有支持的键-值对。
本地化Root.strings
设置束中有一个en.lproj目录,保存了设置界面需要使用的英文版字符串。读者可以将其中的键-值对修改成需要的文字,例如,可以为文本框设置标题:
”NextItemName“ = ”Default Item Name“;
其他名称也可通过以上格式进行修改。构建并运行应用,当用户创建一个新的BNRItem对象时,Homepwner会从设置应用中读取NextItemName的值作为该对象的默认名称。
最后,如果某项用户偏好设置发生了变化(应用内或设置应用中),应用就会收到NSUserDefaultsDidChangeNotification通知。如果某个对象需要及时响应用户偏好设置的变化,就可以将其注册为该通知的观察者。