iOS应用设置、用户默认值与数据持久化全解析
立即解锁
发布时间: 2025-08-24 01:05:44 阅读量: 1 订阅数: 6 

### iOS应用设置、用户默认值与数据持久化全解析
#### 1. 应用设置与用户默认值基础
在iOS开发中,应用设置和用户默认值管理是非常重要的部分。首先,有一个`refreshFields`方法,它的主要作用是获取标准用户默认值,并将所有标签的文本属性设置为用户默认值中对应的对象,使用的是我们在`plist`文件中设置的键值。例如,对于`warpFactorLabel`,由于从用户默认值返回的是`NSNumber`类型,所以要调用`stringValue`方法来获取其字符串表示形式,而其他偏好设置返回的是`NSString`对象。
在`viewDidAppear:`方法中调用`refreshFields`方法,当收到反面控制器即将关闭的通知时,再次调用`refreshFields`方法。这样,在视图加载时,显示的字段会设置为相应的偏好值,当反面视图切换出去时,字段会刷新。因为反面视图是模态处理的,主视图是其模态父视图,所以当反面视图关闭时,`BIDMainViewController`的`viewDidAppear:`方法不会被调用,但我们可以使用实用程序应用程序模板提供的委托方法来实现此功能。
#### 2. 注册默认值
我们创建了一个设置包,其中包含一些默认设置,以便“设置”应用程序可以访问我们应用的偏好设置。但我们的应用并不知道设置包中指定的默认值。例如,删除iOS模拟器或设备上的`AppSettings`应用程序(从而删除应用程序存储的偏好设置),然后再次从Xcode运行它,应用程序启动时所有设置都会显示为空值,即使我们在设置包中定义的曲速驱动设置的默认值也看不到。
为了解决这个问题,`NSUserDefaults`提供了`registerDefaults:`方法,让我们可以指定在查找未设置的键/值时应找到的默认值。为了让这个方法在整个应用中生效,最好在应用启动早期调用。具体操作步骤如下:
1. 选择`BIDAppDelegate.m`文件,在文件顶部包含头文件`#import "BIDMainViewController.h"`。
2. 修改`application:didFinishLaunchingWithOptions:`方法:
```objc
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kWarpDriveKey,
[NSNumber numberWithInt:5], kWarpFactorKey,
@"Greed", kFavoriteSinKey,
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
return YES;
}
```
这里先创建一个包含三个键/值对的字典,使用之前定义的键名,然后将整个字典传递给标准的`NSUserDefaults`实例。从那时起,只要我们没有在应用或“设置”应用中设置不同的值,`NSUserDefaults`就会提供我们指定的值。
#### 3. 在应用中更改默认值
现在我们要构建反面视图。反面视图有曲速驱动开关和曲速因子滑块,我们使用与“设置”应用程序相同的控件(开关和滑块)。在`BIDFlipsideViewController.h`中进行如下更改:
```objc
#import <UIKit/UIKit.h>
@class BIDFlipsideViewController;
@protocol BIDFlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(BIDFlipsideViewController *)controller;
@end
@interface BIDFlipsideViewController : UIViewController
@property (weak, nonatomic) id <BIDFlipsideViewControllerDelegate> delegate;
@property (weak, nonatomic) IBOutlet UISwitch *engineSwitch;
@property (weak, nonatomic) IBOutlet UISlider *warpFactorSlider;
- (void)refreshFields;
- (IBAction)engineSwitchTapped;
- (IBAction)warpSliderTouched;
- (IBAction)done:(id)sender;
@end
```
接下来,在Interface Builder中编辑GUI,具体步骤如下:
1. 保存更改并选择`MainStoryboard.storyboard`,聚焦于反面视图控制器场景。
2. 按住`option`键,展开反面视图控制器及其下面的所有内容。
3. 双击标题栏中的反面视图标题,将其从`Title`更改为`Warp Settings`。
4. 选择反面视图控制器场景中的视图,打开属性检查器,使用“背景”弹出窗口选择“浅灰色”来更改背景颜色。
5. 从库中拖动两个标签到视图窗口,分别将它们改为“Warp Engines:”和“Warp Factor:”。
6. 从库中拖动一个开关到视图右侧,与“Warp Engines”标签相对。从反面视图控制器图标控制拖动到新开关,连接到`engineSwitch`出口,再从开关控制拖动回反面视图控制器图标,连接到`engineSwitchTapped`动作。
7. 从库中拖动一个滑块到“Warp Factor:”标签下方,调整滑块大小使其从左边缘的蓝色指南延伸到右边缘。从反面视图控制器图标控制拖动到滑块,连接到`warpFactorSlider`出口,再从滑块控制拖动到反面视图控制器,选择`warpSliderTouched`动作。
8. 单击滑块(如果还未选中),打开属性检查器,将最小值设置为1.00,最大值设置为10.00,当前值设置为5.00。选择`turtle.png`作为最小图像,`rabbit.png`作为最大图像。
在`BIDFlipsideViewController.m`中进行如下更改:
```objc
#import "BIDFlipsideViewController.h"
#import "BIDMainViewController.h"
@implementation BIDFlipsideViewController
@synthesize delegate = _delegate;
@synthesize engineSwitch;
@synthesize warpFactorSlider;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self refreshFields];
}
- (void)refreshFields {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
engineSwitch.on = [defaults boolForKey:kWarpDriveKey];
warpFactorSlider.value = [defaults floatForKey:kWarpFactorKey];
}
- (IBAction)engineSwitchTapped {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:engineSwitch.on forKey:kWarpDriveKey];
}
- (IBAction)warpSliderTouched {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setFloat:warpFactorSlider.value forKey:kWarpFactorKey];
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.engineSwitch = nil;
self.warpFactorSlider = nil;
}
```
#### 4. 处理应用唤醒和数据同步
当在iOS 4.0或更高版本上运行应用时,按下主屏幕按钮不会真正退出应用,而是将应用挂起在后台。当应用回到前台时,我们需要刷新显示。为此,我们要让每个控制器类订阅`UIApplicationWillEnterForegroundNotification`通知。
在`BIDMainViewCon
0
0
复制全文
相关推荐









