2011-01-30 1 views
4

Я только начал использовать панель настроек, чтобы пользователи могли настроить некоторые параметры в моем приложении iOS, и было довольно легко создать файл Settings.bundle и получить доступ к информации из него. Моя проблема заключается в том, что я прочитал в документации Apple, что параметры должны быть программно инициализировано:Где инициализировать настройки приложения iPhone по умолчанию

Рекомендуются зарегистрировать любые значения предпочтений по умолчанию программно во время запуска в дополнении к включению их в ваших настройках расслоения списков свойств. Для вновь установленных приложений значения предпочтений по умолчанию из набора параметров приложения не устанавливаются до тех пор, пока не будет запущено приложение «Настройки». Это означает, что если пользователь запускает ваше приложение перед запуском настроек, значения по умолчанию, указанные в вашем наборе параметров, будут недоступны. Установка таких значений программно во время запуска гарантирует, что ваше приложение всегда имеет соответствующие значения. Чтобы программно зарегистрировать значения по умолчанию, используйте метод registerDefaults: класс NSUserDefaults.

Где в приложении выполняется эта инициализация и как я могу быть уверенным, что я не переписываю предоставленное пользователем значение? Выполняется ли это в каком-либо методе делегата приложения?

ответ

11

Вы должны зарегистрировать свои значения по умолчанию, прежде чем пытаться получить доступ к значению, хранящемуся в NSUserDefaults. Вы можете сделать это в - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions.
Регистрация настроек по умолчанию выполняется быстро, поэтому нет необходимости оптимизировать это. Просто сделайте это при запуске приложения.

Я храню userdefaults в PLIST и зарегистрировать содержимое этого списка, как это:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

Если зарегистрировать по умолчанию, как это вам не нужно беспокоиться, что вы перезаписать поставляемых пользовательских значений. NSUserdefaults использует «домены», где хранит его значения. Если вы регистрируете свои значения по умолчанию, они сохраняются в домене регистрации. Если пользователь сохраняет значение, эти значения сохраняются в домене приложения.

Если вы попытаетесь получить значение из NSUserdefaults, это выглядит, если значение присутствует в домене приложения, а если оно отсутствует, оно принимает значение из домена регистрации.


Edit:

plist editor

вы бы получить доступ к этим значениям (или лучше, значение, которые хранятся в вашем NSUserDefaults, и те, как запасной вариант, если нет при условии, пользовательских значений), как это:

NSInteger minutesToWait = [[NSUserDefaults standardUserDefaults] integerForKey:@"MinutesToWait"; 
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultURLStr"]; 

Plist - это еще одно представление NSDictionary с ключами и значениями. Ключ - это тот же ключ, который вы используете для доступа к пользовательским идентификаторам, а значение - ваше значение по умолчанию. Довольно прямо.
Не имеет значения, как вы создаете словарь. Вы можете сделать это и в коде.

+0

Так что же, что PLIST выглядеть? просто набор пар ключ/значение, связывающих имена перференций? И имеет значение, если код находится в '- (void) applicationDidFinishLaunching: (UIApplication *) application' или он должен быть в приложении' - (BOOL): (UIApplication *) приложение didFinishLaunchingWithOptions: (NSDictionary *) launchOptions' для некоторая причина? –

+0

@ bill shiff Не имеет значения, где вы это делаете, до тех пор, пока вы это сделаете, прежде чем пытаться получить доступ к вашим пользовательским ошибкам. Для остальных см. Мое редактирование. –

+0

Это отличный способ зарегистрировать сразу множество значений по умолчанию. – memmons

0

Вы можете использовать тот же метод внутри вашего приложения делегат, который используется для установки исходного окна, didFinishLaunchingWithOptions:

Однако вам может понадобиться какая-то логика внутри applicationWillEnterForeground :, потому что потенциально ваш пользователь может поместить приложение в фон, измените настройки внутри приложения настроек, затем возобновите свое приложение и ожидайте, что эти изменения будут применены.

1

Как @fluchtpunkt предложил, вы можете зарегистрировать по умолчанию с помощью:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

Лично я проверяю для каждого значения независимо друг от друга в моем App делегата.

Я пишу метод «перезагрузки», а затем вызываю его при первом запуске. Я предпочитаю делать это в коде, но теоретически вы можете использовать plist. Я просто чувствую, что это еще одно место, чтобы пойти не так.

0

Ответы @MatthiasBauch или @ Moshe, скорее всего, будут работать для большинства людей, но для тех, кто, как я, были свои настройки в файле Root.plist (я использовал InAppSettingsKit), вам нужно углубиться в это глубже конкретный файл plist, чтобы получить фактические значения по умолчанию для настроек (поскольку они не находятся на верхнем уровне plist, но вложены под ключ PreferenceSpecifiers). Вот ссылка на другой ответ здесь, содержащий дополнительный код, который работал для меня:

https://stackoverflow.com/a/10497898/381233