• 应用设置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这个选项就是设置是否加密。

    其它都非常easy理解。

    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 plaincopy
     
    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 plaincopy
     
    1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
    2.   
    3. value = [defaults floatForKey:kSensitivityValue];  
    4. switch  = [defaults boolForKey:kScreenAutoLock];  


    3)更改数据

     

     

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


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

     

     

    4)补充

    单单使用上面的方法还不够,存在的问题就是假设我们在设置中进行设置更改,那么这是假设应用已启动,打开应用后数据由于没有同步。还是设置前的数据。

    因此,在程序EnterForeground时候,应用应该进行数据的同步。

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

    代码:

     

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

     

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


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

  • 相关阅读:
    【 USACO11JAN】 利润 【洛谷P3009】
    【诗和远方】一个蒟蒻的年初展望
    【眼前的苟且】一个蒟蒻的年终总结
    【NOJ2024】入栈序列和出栈序列
    【洛谷P1632】点的移动
    【洛谷】P1880 石子合并
    【洛谷】【USACO】P1118 数字三角形
    【CodeVS】1083 Cantor表
    【CODEVS】2833 奇怪的梦境
    【洛谷】P1876 开灯
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7243549.html
Copyright © 2020-2023  润新知