iOS之应用设置

如今,即便是最简单的计算机程序也会包含一个偏好设置窗口,用户可以在其中设置应用专属的选项。在MAC OS X中,Preferences...菜单通常位于应用菜单中。选择该菜单项会弹出一个窗口,用户可以在其中输入和更改各种选项。iPhone和其他iOS设备有一个专门的“设置”应用程序来进行各种设置,你肯定用过很多次了。

设置捆绑包

通过应用设置,用户可以输入和更改任何带有设置捆绑包(settings bundle)的应用中的偏好设置。设置捆绑包是应用自带的一组文件,用于告诉设置该应用期望得到用户的哪些偏好设置。下图是实例效果图:

       

对于iOS用户默认设置(User Defaults)机制,设置应用充当着通用用户界面的角色。用户默认设置是保存和获取偏好设置的系统的一部分。

在iOS应用中,用户默认设置由NSUserDefaults类实现。应用通过NSUserDefaults用键值对的方式来读取和保存偏好设置数据,与通过键从NSDictionary对象中获取数据一样。不同之处在于NSUserDefaults数据会被持久保存在文件系统中,而不是存储在内存的对象实例中。

应用

接下来的部分,通过创建一个简单的应用,来实现应用设置控制应用程序。

创建应用

在Xcode中,创建Tabbed Application工程。

使用设置捆绑包

设置应用使用每个应用中设置捆绑包的内容构建出一个应用的设置视图。如果应用没有设置捆绑包,则设置应用不会显示出应用程序的任何信息。每个设置捆绑包必须包含一个名为Root.plist的属性列表,它定义了根级偏好设置视图。此属性列表必须遵循一种非常严格的格式。

当设置应用启动时,它会检查每个应用程序的设置捆绑包并为包含设置捆绑包的每个应用添加设置组。

在项目中添加设置捆绑包

新建设置捆绑包,操作如下图

在iOS-->Resource-->Settings Bundle点击Next,名字保留默认,最后点击Create即可。

编辑属性列表文件

接下来需要编辑Root.plist文件,具体内容如下图

在Item8中,引用的More.plist文件,具体内容如下图

这里需要补充说明一点:

iOS上的应用不能从其他应用的沙盒中读取文件。设置捆绑包并不是我们应用沙盒的一部分,而是设置应用沙盒的一部分。

设计展示界面

数据准备好之后,添加图标资源,设计数据展示界面。效果图如下

    

界面是通过代码实现的,主要使用了如下几个控件:

@interface FirstViewController ()

@property (nonatomic, strong) UILabel *officerLabel;
@property (nonatomic, strong) UILabel *authorizationCodeLabel;
@property (nonatomic, strong) UILabel *rankLabel;
@property (nonatomic, strong) UILabel *warpDriveLabel;
@property (nonatomic, strong) UILabel *warpFactorLabel;
@property (nonatomic, strong) UILabel *favoriteTeaLabel;
@property (nonatomic, strong) UILabel *favoriteCaptainLabel;
@property (nonatomic, strong) UILabel *favoriteGadgetLabel;
@property (nonatomic, strong) UILabel *favoriteAlienLabel;

@end
@interface SecondViewController ()

@property (nonatomic, strong) UISwitch *engineSwitch;
@property (nonatomic, strong) UISlider *warpFactorSlider;
@property (nonatomic, strong) UIButton *settingInfo;

@end

读取应用中的设置

我们将使用NSUserDefaults类访问用户设置。NSUserDefaults作为单例类,意味着应用中只能有一个NSUserDefaults实例在运行。为了访问这个实例,需要调用standardUserDefaults。

键宏定义

#ifndef BridgeControl_Constants_h
#define BridgeControl_Constants_h

#define kOfficerKey @"officer"
#define kAuthorizationCodeKey @"authorizationCode"
#define kRankKey @"rank"
#define kWarpDriveKey @"warp"
#define kWarpFactorKey @"warpFactor"
#define kFavoriteTeaKey @"favoriteTea"
#define kFavoriteCaptionKey @"favoriteCaptain"
#define kFavoriteGadgetKey @"favoriteGadget"
#define kFavoriteAlienKey @"favoriteAlien"

#endif

更新主视图控制器

//FirstViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self refreshFields];
}

-(void)refreshFields{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    self.officerLabel.text = [defaults objectForKey:kOfficerKey];
    self.authorizationCodeLabel.text = [defaults objectForKey:kAuthorizationCodeKey];
    self.rankLabel.text = [defaults objectForKey:kRankKey];
    self.warpDriveLabel.text = [defaults boolForKey:kWarpDriveKey] ? @"engaged" : @"Disabled";
    self.warpFactorLabel.text = [[defaults objectForKey:kWarpFactorKey] stringValue];
    self.favoriteTeaLabel.text = [defaults objectForKey:kFavoriteTeaKey];
    self.favoriteCaptainLabel.text = [defaults objectForKey:kFavoriteCaptionKey];
    self.favoriteGadgetLabel.text = [defaults objectForKey:kFavoriteGadgetKey];
    self.favoriteAlienLabel.text = [defaults objectForKey:kFavoriteAlienKey];
}
//SecondViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self refreshFields];
}

-(void)refreshFields{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    self.engineSwitch.on = [defaults boolForKey:kWarpDriveKey];
    self.warpFactorSlider.value = [defaults floatForKey:kWarpFactorKey];
}

添加控件响应事件

为SecondViewController中的UIButton,UISwitch和UISlider控件添加监听事件。

- (void)engineSwitchTapped {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:self.engineSwitch.on forKey:kWarpDriveKey];
    [defaults synchronize];
}

- (void)warpSliderTouched {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setFloat:self.warpFactorSlider.value forKey:kWarpFactorKey];
    [defaults synchronize];
}
//切换到“设置”应用程序
-(void)settingInfoClicked{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}

注册默认值

//AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    //程序启动后的一些自定义设置
    NSDictionary *defaults = @{kWarpDriveKey:@YES,
                               kWarpFactorKey:@2,
                               kFavoriteAlienKey:@"Vulcan"
                               };
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];

    return YES;
}

保证设置有效

如果现在将应用运行,查看设置信息并按下主屏幕按钮来修改一些值。然后再按Home键,再重新打开应用,结果发现设置并没有生效。

原因在于:在iOS中,当应用正在运行时按Home键并不会退出该应用,而是由操作系统在后台将其暂停,这样它就能随时快速启动。

在这个例子中,我们需要添加一点工作,以实现应用被唤醒时,能重新加载用户偏好设置并重新显示它们。

通知,时对象之间进行通信的轻量级机制。任何对象都能定义一个或多个发送到应用通知中心的通知。通知中心是一个单例对象,作用在于对象之间传送通知。

UIApplication类会发送大量的通知,大多数通知的用途从命名就能看出来,这个例子中我们就使用到了通知。

将下列代码添加到两个控制器的viewDidLoad方法中:

UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:app];

然后添加相应的响应方法

-(void)applicationWillEnterForeground:(NSNotification *)notification{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults synchronize];
    [self refreshFields];
}

小结

本文主要讲解了如何使用应用设置,如何使用NSUserDefaults读取偏好设置,以及如何让用户在应用内修改偏好设置。

实例源代码地址:https://github.com/CharsDavy/BridgeControl

时间: 2024-10-12 23:50:32

iOS之应用设置的相关文章

iOS UIButton同时设置title和image属性

在iOS开发中,使用UIButton设置title和image,达到tabBarItem的效果,即title在下,image在上: 目前,我发现有两种比较好的方法: 方法一,使用UIEdgeInsets UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; [button setFrame:CGRectMake(100, 100, 60, 60)]; [button setBackgroundColor:[UIColor

iOS应用IAP设置总结

iOS应用调置 wjforstudy分享了IAP的一些基本知识.在论坛的地址是:http://www.cocoachina.com/bbs/read.php?tid=92060 1.在开始IAP开发前,先要对IAP有个大概的了解,下面这片文章就是给你预备的:  苹果的官方文档:Store Kit Guide(In App Purchase)    现在网上已经有对这个文档很成熟的翻译了,如果想加快阅读速度,看这里    翻译版本:http://yarin.blog.51cto.com/11308

iOS程序偏好设置--进阶

iOS的App除了在应用程序内部做偏好设置页面,还可以在setting里配置出偏好设置页面.如下图 专家容志芳在这篇文章有详细的入门介绍,基本的原理是为工程添加settings.bundle后,会在里面看到root.plist,通过修改它里面的配置,来自定义自己的setting页面,其中的控件有以下7种. 通过type来决定是哪种控件,除了子面板外,基本通过value和title来设置控件,子面板使用如下: 在Settings.bundle里新建了名为Acknowledgements1.plis

(iOS)确保设置话筒模式成功 AudioSessionSetProperty

本人编写过一个应用,需要把实时音频播放出来,并且要从话筒播放声音,为此,作以下操作: //Step 1: 初始化 AudioSessionInitialize(NULL,NULL, NULL, self); //Step 2: 必须设置成这样才能确保话筒模式成功 UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; AudioSessionSetProperty(kAudioSessionProperty_AudioCateg

教你如何在iOS项目中设置各种字体

在iOS开发中设置字体的方法有很多种,下面为大家介绍比较常用的三种方法 1.使用系统默认提供的字体 系统默认提供的字体主要是指UIFont中提供的字体,其使用代码为: fontLabel.font = [UIFont fontWithName:@"Marion" size:17]; 或者是通过字体详细字典对字体属性进行设置 /* UIFontDescriptorFamilyAttribute:设置字体家族名 UIFontDescriptorNameAttribute :设置字体的字体名

iOS 8 Xcode6 设置Launch Image 启动图片<转>

如何设置App的启动图,也就是Launch Image? Step1 1.点击Image.xcassets 进入图片管理,然后右击,弹出"New Launch Image" 2.如图,右侧的勾选可以让你选择是否要对ipad,横屏,竖屏,以及低版本的ios系统做支持.这边我选了ios8.0,ios7.0,ios6没有做支持. Step2 将规定尺寸的图片从你的文件中拖动进到固定位置. 系统 尺寸 分辨率 ios8 Retina HD5.5 1242x2208   Retina HD4.7

IOS开发—IOS 8 中设置applicationIconBadgeNumber和消息推送

摘要 在IOS7中设置applicationIconBadgeNumber不会有什么问题,但是直接在IOS8中设置applicationIconBadgeNumber会报错 因为在IOS8中要想设置applicationIconBadgeNumber,需要用户的授权,在IOS8中,需要加上下面的代码: UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotifica

iOS图片圆角设置的正确姿势

最近从上一家公司辞职,一直处于待业状态,顺便再家里带带闺女,今天有时间,所以写点东西,希望刚开始接触iOS开发的小白能够有所收获. 在iOS开发中圆角图片很常见,但是我们一般在设置图片圆角的时候几乎都是这样设置的: UIImageView *image = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)]; image.layer.cornerRadius = 25.0; image.layer.masksToBoun

iOS开发中设置UITextField的占位文字的颜色,和光标的颜色

在iOS开发中,对于很多初学者而言,很有可能碰到需要修改UITextField的占位文字的颜色,以及当UITextField成为第一响应者后光标的颜色,那么下面小编就介绍一下修改占位文字和光标的颜色.1:当你在使用Storyboard开发是,点击UITextField,在点击右上角的属性检测器,其实在这里面你是找不到有可以修改占位文字和光标颜色的属性的.2:那就进入UITextField的协议里面去查找,但是还是找不到,3:在进代理里面去查找,看看有没有通过代理方法,返回颜色并控制占位文字的方法