Где инициализировать приложения iPhone по умолчанию - PullRequest
4 голосов
/ 30 января 2011

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

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

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

Ответы [ 4 ]

11 голосов
/ 30 января 2011

Вы должны зарегистрировать свои значения по умолчанию, прежде чем пытаться получить доступ к значению, хранящемуся в ваших 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, он проверяет, присутствует ли значение в домене приложения, и если его нет, оно берет значение из домена регистрации.


Редактировать:

plist editor

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

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

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

1 голос
/ 30 января 2011

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

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

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

#define kSettings [NSUserDefaults]
if([kSettings boolForKey:@"firstRun"] == nil){

  //   
  //   Set up the initial settings...
  //


  [kSettings setBool:NO forKey:@"firstRun"]; 
}

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

0 голосов
/ 09 сентября 2013

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

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

0 голосов
/ 30 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...