1

首先,InAppSettingsKit 正是我想要的。一旦我弄清楚了一些事情,它将为我节省大量时间。

我的问题是:如何通过继承 IASKAbstractSettingsStore 来创建自己的商店?IASK的主页说:

IASK 的默认行为是将设置存储在 [NSUserDefaults standardUserDefaults] 中。但是,可以通过在 IASKAppSettingsViewController 上设置 settingsStore 属性来更改此行为。

创建自己的商店的最简单方法是创建 IASKAbstractSettingsStore 的子类。

我花了很多时间梳理代码,我想我理解了它的基本结构。但是,我无法弄清楚将 settingsStore 属性设置为的方式内容。

我可以看到在 IASKAppSettingsViewController 中定义和实现的 settingsStore:

id<IASKSettingsStore>  _settingsStore; 

- (id<IASKSettingsStore>)settingsStore {
if (!_settingsStore) {
    _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init];
}
return _settingsStore;

}

我尝试子类化 IASKAbstractSettingsStore:

#import <Foundation/Foundation.h>
#import "IASKSettingsStore.h"

@interface IASKSettingsStoreMeals : IASKAbstractSettingsStore {
NSString * _filePath;
NSMutableDictionary * _dict;
}
- (id)initWithPath:(NSString*)path;
@end

然后修改 IASKAppSettingsViewController 的 settingsStore 属性以分配和初始化我的新类 IASKSettingsStoreMeals 而不是 IASKSettingsStoreUserDefaults - 我能看到更改属性的唯一方法:

- (id<IASKSettingsStore>)settingsStore {
if (!_settingsStore) {
    _settingsStore = [[IASKSettingsStoreMeals alloc] init];
}
return _settingsStore;

}

当我构建和运行时,当我尝试第一个控件(切换开关)时收到以下消息,所有其他字段都没有保存:

attempt to insert nil value at objects[0] (key: toggleSwitch)

我究竟做错了什么?除了“重新调整”代码以使用 IASKSettingsStoreFile(或子类 IASKAbstractSettingsStore)所需的更改之外,我还看不到在哪里设置文件路径更改保存设置的位置 - 或者是在后面完成的场景。期待通过这个学习曲线并使用它。

4

1 回答 1

2

找到了答案。

我的问题总体上揭示了我对面向对象语言的缺乏经验,尤其是封装和框架的概念。无需对 IASK 框架代码进行任何更改,所有代码都已添加到我的根视图控制器中。

我创建了另一个 IASKAppSettingsViewController 实例,并添加了以下代码来更改 plist 位置:

// the path to write file
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *settingsFile = [documentsDirectory stringByAppendingPathComponent:@"mySettings"];
IASKSettingsStoreFile *mySettingsBundle = [[IASKSettingsStoreFile alloc] initWithPath:settingsFile]; 

self.appSettingsViewController.settingsStore = mySettingsBundle;

UINavigationController *aNavController = [[UINavigationController alloc] initWithRootViewController:self.appSettingsViewController];
[mySettingsBundle release];

self.appSettingsViewController.settingsStore = mySettingsBundle;

//[viewController setShowCreditsFooter:NO];   // Uncomment to not display InAppSettingsKit credits for creators.
// But we encourage you not to uncomment. Thank you!
self.appSettingsViewController.showDoneButton = YES;
[self presentModalViewController:aNavController animated:YES];
[aNavController release];
于 2011-04-09T20:57:23.697 回答