应用设置Setting的实现

Posted 金融家中的懂编程者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用设置Setting的实现相关的知识,希望对你有一定的参考价值。

有很多应用都在ios设置中有相关的设置,如下图:

   

 

通过这个设置可以方便的对应用的一些基本的设置进行更改。

要完整的实现这个设置功能,有以下几方面问题需要解决:

1)设置的编写(实现设置的功能)

2)设置内容的存储(保证设置经过更改后能立即生效。比如最小化应用,然后在设置中更改,重新打开应用,应该显示新的设置方式)

 

关于这方面的内容可以参考苹果开发文档:Preferences and Settings Programming Guide

下面说一下实现过程:

 

STEP 1:编写设置

通过Settings Bundle来实现。

1) 新建一个Settings Bundle:


创建好后可以看到如下内容:


我们可以看到,settings bundle里面包含了两个文件,一个是Root.plist用于设置要设置的内容,另一个Root.strings用于多语言化。我们现在不考虑多语言化的内容,只看Root.plist的设置方法。

我们看到Root.plist文件里面已经预先有几个item,这些就是要设置的内容。一共有7种类型:


这些很好理解,除了Child pane都是一些控件,只是这里通过plist文件来实现。Child pane是子页面,可能相对麻烦一点。先说一下前面几个。

 

首先看一下要的效果:


 

1)Group

设置如下:


2)Text Field

设置如下:


这里的identifier就是之后存储需要用到的Key,就是利用NSUserDefaults,之后介绍。

然后Text Field is Secure这个选项就是设置是否加密。其他都很容易理解。

3)Toggle Switch


4)Slider


可以添加左右图片

5)Multi Value


设置如下:


 

下面介绍一下Child Pane的使用。

要添加新的设置页面,需要创建新的plist。


上图摘自开发文档,可以很清楚的看出结构。

因此我们需要创建新的plist文件。

关键点在于我们不能在Xcode中创建,因为在Xcode中我们无法将文件拉进bundle里面,因此,最简单的方法就是,打开bundle的文件管理器,然后复制Root.plist,再改名!!!


 

接下来是设置Child Pane:


filename就是新的plist的名称,无需加后缀。

然后在Child.plist的编辑和Root.plist一样。关键点在于为了编辑方便,应该将Child.plist的类型设置为iPhone Settings plist

 


OK,通过上面的方法,我们就可以在界面上完成需要的设置功能。下面是进行数据的操作。

 

STEP 2:使用NSUserDefaults实现preference的存储。

首先明确的是上面的Setting的数据将存储在NSUserDefaults中StandardDefaults当中,每个设置对应的identifier就是Key。

 

1)一般我们需要设置一些初始数据,也就是应用第一次打开就能将数据进行初始默认设置。

代码:

 

[plain]  view plain copy  
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  2.   
  3.     // Override point for customization after application launch.  
  4.       
  5.     NSDictionary *defaults = @kScreenAutoLock: @NO,  
  6.                                kSensitivityValue: @5;  
  7.     [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];  
  8.     return YES;  
  9.   


通过一个dictionary来进行设置。这里的kScreenAutoLock是macro定义的key,就是identifier

 

2)在获取数据

 

[plain]  view plain copy  
  1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  2.   
  3. value = [defaults floatForKey:kSensitivityValue];  
  4. switch  = [defaults boolForKey:kScreenAutoLock];  


3)更改数据

 

 

[plain]  view plain copy  
  1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  2.   
  3. [defaults setFloat:5.0f forKey:kSensitivityValue];  
  4. [defaults synchronize];  


记住要使用synchronize来实现数据的存储。

 

 

4)补充

单单使用上面的方法还不够,存在的问题就是如果我们在设置中进行设置更改,那么这是如果应用已启动,打开应用后数据因为没有同步,还是设置前的数据。因此,在程序EnterForeground时候,应用应该进行数据的同步。

在使用中,就是通过notification,在EnterForeground时候同步更改的数据

代码:

 

[plain]  view plain copy  
  1. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];  

 

[plain]  view plain copy  
  1. - (void)applicationWillEnterForeground:(NSNotification *)notification  
  2.   
  3.     [[NSUserDefaults standardUserDefaults] synchronize];  
  4.     [self refreshSettings]; // 更新设置显示  
  5.   


关于settings的内容就介绍到这。

以上是关于应用设置Setting的实现的主要内容,如果未能解决你的问题,请参考以下文章

PES6 Setting中的默认设置

mac的一些基本设置(分享篇)

php 拉进一个Instagram饲料

如何设置Windows和centOS的共享文件夹? 简单实现步骤如下

[吃药HoloLens开发随笔] 项目设置(Project Setting)

设置“AppleLanguages”不会更改应用程序语言