[iOS基礎]應用程序設置


關於設置與配置
1]設置 :應用之外的一個應用
2]配置:應用內開闢的一塊功能
對於一個應用,如果設置的時候需要先退出的話,一般情況屬於設置,不需要退出的話則爲配置(例如:遊戲的音響開啓屬於配置 )


設置


對於設置與配置有個大概的瞭解之後,接下來就說一下如何給一個應用添加“設置”的相關內容


應用程序設置包(Settings Bundle)

1、創建
(1)先創一個YCF_Test的工程
(2)File -> New -> New -> iOS -> Resource -> Settings Bundle -> next -> create :操作完得到Settings.bundle,如下:
這裏寫圖片描述

Root.Strings內容:

"Group" = "Group";
"Name" = "Name";
"none given" = "none given";
"Enabled" = "Enabled";

Root.plist內容:
這裏寫圖片描述

2、顯示詳細內容
選擇圖一的Settings.bundle -> Show in Finder ->選中Finder中的Settings.bundle -> 顯示包內容

3、添加文件或圖片
(1)顯示詳細內容
(2)將文件或圖片拖進即可

運行看效果:
這裏寫圖片描述

點擊YCF_Test可以看到:
這裏寫圖片描述

設置

下面進行“設置”的添加,也就是對圖二中的Preference Items內容修改成我們所需要的:
這裏寫圖片描述

將會涉及6種類型:
Group 、 Multi Value 、 Slider 、 Text Field 、Title 、 Toggle Switch

1、PSGroupSpecifier – 相當於tableView的header
(1)應該放在該組最前面
(2)如果添加的標題前面沒有任何分組的信息,則默認爲一個分組
(3)可以通過兩種方式:

方式一:
這裏寫圖片描述

方式二:

<dict>
    <key>Type</key>
    <string>PSGroupSpecifier</string>
    <key>Title</key>
    <string>賬號</string>
</dict>

2、PSTextFieldSpecifier

方法一:
這裏寫圖片描述

爲什麼要設置Identifier呢?
下面獲取設置信息時,我們將通過Identifier來區分

方法二:

        <dict>
            <key>Type</key>
            <string>PSTextFieldSpecifier</string>
            <key>Title</key>
            <string>用戶名</string>
            <key>Key</key>
            <string>name_preference</string>
            <key>KeyboardType</key>
            <string>Alphabet</string>
            <key>IsSecure</key>
            <false/>
            <key>DefaultValue</key>
            <string></string>
            <key>AutocorrectionType</key>
            <string>None</string>
            <key>AutocapitalizationType</key>
            <string>None</string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSTextFieldSpecifier</string>
            <key>Title</key>
            <string>密碼</string>
            <key>Key</key>
            <string>password_preference</string>
            <key>AutocapitalizationType</key>
            <string>None</string>
            <key>AutocorrectionType</key>
            <string>No</string>
            <key>KeyboardType</key>
            <string>Alphabet</string>
            <key>IsSecure</key>
            <true/>
            <key>DefaultValue</key>
            <string></string>
        </dict>

3、其他的具體操作就不詳說

PSToggleSwitchSpecifier
PSSliderSpecifier
PSMultiValueSpecifier
PSChildPaneSpecifier
PSTitleValueSpecifier

        <dict>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
            <key>Title</key>
            <string></string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>
            <string>每月流量控制</string>
            <key>Key</key>
            <string>enable_preference</string>
            <key>DefaultValue</key>
            <true/>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
            <key>Title</key>
            <string>每月流量控制(GB)</string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSSliderSpecifier</string>
            <key>Key</key>
            <string>slider_preference</string>
            <key>DefaultValue</key>
            <real>0.5</real>
            <key>MinimumValueImage</key>
            <string>[email protected]</string>
            <key>MaximumValueImage</key>
            <string>Menu_Icon_Message_Point@2x</string>
            <key>MinimumValue</key>
            <integer>0</integer>
            <key>MaximumValue</key>
            <integer>1</integer>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
            <key>Title</key>
            <string></string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSMultiValueSpecifier</string>
            <key>Values</key>
            <array>
                <string>你的服務器</string>
                <string>我的服務器</string>
            </array>
            <key>Title</key>
            <string>服務器</string>
            <key>Key</key>
            <string>multiValue_preference</string>
            <key>DefaultValue</key>
            <string>可選服務器</string>
            <key>Titles</key>
            <array>
                <string>本地服務器</string>
                <string>遠程服務器</string>
            </array>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSChildPaneSpecifier</string>
            <key>Title</key>
            <string>通知</string>
            <key>File</key>
            <string>Notification</string>
        </dict>

從上面看到PSMultiValueSpecifier的Values和Titles內容很像

            <key>Values</key>
            <array>
                <string>你的服務器</string>
                <string>我的服務器</string>
            </array>

            <key>Titles</key>
            <array>
                <string>本地服務器</string>
                <string>遠程服務器</string>
            </array>

Values的內容是獲取設置內容是看到的信息
Titles的內容是提供的選項中可見的

PSMultiValueSpecifier 與 PSChildPaneSpecifier :
PSMultiValueSpecifier :多選一

這裏寫圖片描述

“通知”的點擊後跳轉到另一個界面,該界面的設置用Notification.plist
(1)創建Notification.plist
(2)添加內容
這裏寫圖片描述

複製Root.plist中的:

<key>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>

然後補全爲:

<key>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string></string>
            <key>Type</key>
            <string>PSGroupSpercifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <true/>
            <key>Key</key>
            <string>sound_enabled_preference</string>
            <key>Title</key>
            <string>聲音</string>
            <key>Type</key>
            <string>PSToggleSwitchSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <true/>
            <key>Key</key>
            <string>vibrate_enabled_preference</string>
            <key>Title</key>
            <string>振動</string>
            <key>Type</key>
            <string>PSToggleSwitchSpecifier</string>
        </dict>
    </array>

看一下運行效果:
這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

讀取設置內容

// 根據要求搭建UI

//  Created by 陽丞楓 on 16/10/27.
//  Copyright © 2016年 chengfengYang. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UILabel *password;
@property (weak, nonatomic) IBOutlet UILabel *username;
@property (weak, nonatomic) IBOutlet UILabel *clearCache;
@property (weak, nonatomic) IBOutlet UILabel *flowermeter;
@property (weak, nonatomic) IBOutlet UILabel *serverName;
@property (weak, nonatomic) IBOutlet UILabel *notiSound;
@property (weak, nonatomic) IBOutlet UILabel *notiVibrate;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];  
}

- (void)viewWillAppear:(BOOL)animated {
    [self getData:nil];
}

- (IBAction)getData:(id)sender {

 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    self.username.text = [userDefault stringForKey:@"name_preference"];
    self.password.text = [userDefault stringForKey:@"password_preference"];
    if([userDefault boolForKey:@"enable_preference"]) {
        self.clearCache.text = @"YES";
    } else {
        self.clearCache.text = @"NO";
    }
    self.flowermeter.text = [NSString stringWithFormat:@"%.2fGB", [userDefault doubleForKey:@"slider_preference"]];
    self.serverName.text = [userDefault stringForKey:@"multiValue_preference"];
    if([userDefault boolForKey:@"sound_enabled_preference"]) {
        self.notiSound.text = @"YES";
    } else {
        self.notiSound.text = @"NO";
    }
    if([userDefault boolForKey:@"vibrate_enabled_preference"]) {
        self.notiVibrate.text = @"YES";
    } else {
        self.notiVibrate.text = @"NO";
    }   
}

@end

(1)刪除模擬器的應用再運行
(2)進行有關設置
(3)點擊按鈕“查看修改後的按鈕”
這裏寫圖片描述

大致流程如上

問題

未進行設置前,所有BOOLEAN類型的值都輸出位NO,但是很明顯所有PSToggleSwitchSpecifier的DefaultValue都設置爲YES
有沒有可能返回nil而被初始化爲NO呢?

(lldb) po [userDefault boolForKey:@"enable_preference"]
NO

(lldb) 

明顯返回值就是NO
也就是說默認設置只能被“設置”所識別,而獲取默認設置信息時是無效的
在stack overflow看到:https://oleb.net/blog/2014/02/nsuserdefaults-handling-default-values/
【未完,待續···】

發佈了239 篇原創文章 · 獲贊 30 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章