#objective-c #cocoa-touch #inappsettingskit #inappsettings
#objective-c #cocoa-touch #inappsettingskit #inappsettings
Вопрос:
Во-первых, InAppSettingsKit — это именно то, что я искал. Как только я разберусь с некоторыми вещами, это сэкономит мне кучу времени.
Мой вопрос таков: как мне создать свой собственный магазин, создав подкласс IASKAbstractSettingsStore? Главная страница IASK гласит:
Поведение IASK по умолчанию заключается в сохранении настроек в [NSUserDefaults standardUserDefaults]. Однако это поведение можно изменить, установив свойство settingsStore в IASKAppSettingsViewController.
и
Самый простой способ создать свой собственный магазин — это создать подкласс IASKAbstractSettingsStore.
Я потратил много времени на изучение кода, и я думаю, что понимаю его базовую структуру. Однако я не могу понять, как и чему присвоить свойство settingsStore.
Я вижу, что settingsStore определен и реализован в IASKAppSettingsViewController:
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
а затем изменил свойство settingsStore IASKAppSettingsViewController, чтобы выделить и инициализировать мой новый класс 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), я также не вижу, где задать путь к файлу, измените местоположение, в котором сохраняются настройки, — или это делается за кулисами. С нетерпением жду возможности пройти эту кривую обучения и использовать это.
Ответ №1:
Найден ответ.
Мой вопрос показывает мою неопытность с объектно-ориентированными языками в целом и концепцией инкапсуляции и фреймворками в частности. Никаких изменений в код IASK framework вносить не требовалось, весь код был добавлен в мой корневой контроллер просмотра.
Я создал другой экземпляр IASKAppSettingsViewController и добавил следующий код для изменения расположения списка:
// 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];
Комментарии:
1. Здорово, что вы нашли решение самостоятельно. Возможно, нам следует немного улучшить документацию или включить case в пример приложения.
2. Спасибо, что поделились своим решением. Я также боролся с методом initWithPath. Ваш пример заставил все работать. (Я создал расширение IASKSettingsStoreFile таким образом, чтобы пароли хранились в собственной цепочке ключей, а не в plist для лучшей защиты.)