Arhn - архитектура программирования

UserDefault всегда возвращает nil

UserDefaults не работают в моем приложении. Пожалуйста, найдите приведенный ниже код в файле AppDelegate.

let sharingData = UserDefaults.init(suiteName: "group.macuser79.xxx");
sharingData?.set("vincenzo", forKey:"username");
sharingData?.synchronize();

В InterfaceController приложения для просмотра, чтобы получить значение, я сделал следующее:

override func awake(withContext context: Any?) {
let sharingData = UserDefaults.init(suiteName: "group.macuser79.xxx");

let username = sharingData?.object(forKey: "username");
    print("Value username \(username)");
}

Пожалуйста, дайте мне знать, что я делаю неправильно!


  • Альтернативное решение: используйте GenericKeychain. developer.apple.com/library/content/samplecode/GenericKeychain/ 14.11.2016
  • Первое, на что нужно обратить внимание, это сделать так, чтобы группа group.macuser79.xxx была определена на вкладке возможностей проекта в обеих целях. 14.11.2016
  • @Отавио. Привет, я проверил, определена ли группа как в цели, так и была определена. Были определены как в целевом устройстве iPhone, так и в целевом ‹MyApp› Watch, определены в расширениях ‹MyApp› Watch, и все кажется в порядке. Я также обновил профиль подготовки, но, к сожалению, ничего. 14.11.2016
  • Хм, этот код является прямым портом из моего кода, написанного на Objective-C, поэтому я не могу найти никакой ошибки. Является ли объект sharingData не нулевым в обоих случаях? 14.11.2016
  • @Otávio Извините, но я не думал, что это ваш код, на самом деле я нашел много примеров, где показано, как писать код. Однако в обоих случаях объект не является нулевым. 14.11.2016
  • Я не имел в виду, что вы портировали его из моего кода. Просто хотел указать, что мой код и ваш код почти одинаковы, поэтому я не могу четко видеть, что вы делаете неправильно. 14.11.2016
  • @Otávio Если хотите, я могу поместить весь ваш код, как AppDelegate, так и как способ восстановить информацию внутри WatchKit приложения, но я считаю, что это настолько тривиально, что я не могу понять, что за ошибка. Я думаю, что это проблема симулятора, на самом деле я заметил, что запросы к удаленному URL-адресу нулевые или долгие, около 10 минут, в то время как тот же запрос выполняется с симулятором iPhone очень быстро 14.11.2016
  • Извините за путаницу, но я не имел в виду, что у меня есть право собственности на код, совсем нет. Я просто хотел сравнить вашу реализацию с моей, и обе они случайно (совершенно случайно и из-за тривиального кода) оказались одинаковыми. Нет необходимости удалять какой-либо код. Как вы сказали, этот код есть даже в образце Apple. 14.11.2016
  • Давайте продолжим обсуждение в чате. 14.11.2016

Ответы:


1

В Swift3 UserDefaults сделано намного умнее, чтобы получить сохраненное значение. В строке ниже вы сохраняете значение String, не указывая его!:

sharingData?.set("vincenzo", forKey:"username");

Итак, чтобы получить это, вам нужно написать, как показано ниже:

let username = sharingData?.string(forKey: "username");
    print("Value username \(username)");
}

Это гораздо лучший контекст для получения значений на основе вашего Магазина.

14.11.2016
  • Здравствуйте, спасибо за ваш ответ, но, к сожалению, он не работает. Я исправил свой код, как я указал, но, к сожалению, значение всегда равно нулю. Я также запускал приложение на симуляторе iPhone, но, к сожалению, оно не работает. 14.11.2016
  • Здравствуйте, я провел небольшое исследование в Интернете, и по этой ссылке у пользователя возникла та же проблема, что и у меня. stackoverflow .com/questions/39808319/ Это должно быть проблемой симулятора Apple Watch. Теперь, как мне решить, чтобы я мог попытаться протестировать свое приложение? У меня остался только один, и тогда я могу опубликовать. Спасибо, Винченцо. 15.11.2016

  • 2

    Попробуйте это вместо этого:

    let defaults = UserDefaults.standard 
    defaults.set("group.macuser79.xxx", forKey:"username")
    defaults.synchronize()
    

    Чтобы получить доступ к магазину:

    let defaults = UserDefaults.standard
    let username = defaults.string(forKey: "username")
    

    Я признаю, что раньше не пытался init() создать свой собственный UserDefaults экземпляр, но его стандартный экземпляр, который iOS превращает в синглтон, является хорошей практикой.

    Кроме того, не забудьте правильно развернуть необязательный элемент.

    14.11.2016
  • Привет, я пытался с вашими инструкциями, но, к сожалению, это всегда ноль 14.11.2016
  • Извинения! Прочитайте это для получения дополнительной информации: stackoverflow.com/questions/27025526/ 14.11.2016
  • Здравствуйте, я провел небольшое исследование в Интернете, и по этой ссылке у пользователя возникла та же проблема, что и у меня. stackoverflow .com/questions/39808319/ Это должно быть проблемой симулятора Apple Watch. Теперь, как мне решить, чтобы я мог попытаться протестировать свое приложение? У меня остался только один, и тогда я могу опубликовать. Спасибо, Винченцо. 15.11.2016

  • 3

    Устанавливать:

    UserDefaults(suiteName: "group.macuser79.xxx")?.set("vincenzo", forKey: "username")
    

    Чтобы получить доступ:

    UserDefaults(suiteName: "group.macuser79.xxx")!.string(forKey: "username")
    
    14.11.2016
  • Привет, я пытался сделать то, что я указал, но, к сожалению, это не работает. На данный момент я думаю, что проблема с симулятором, потому что я не знаю, что еще думать. Я попробую Apple Watch другу, чтобы понять, проблема в этом или нет. Спасибо за доступность. Винченцо 15.11.2016
  • Здравствуйте, я провел небольшое исследование в Интернете, и по этой ссылке у пользователя возникла та же проблема, что и у меня. stackoverflow .com/questions/39808319/ Это должно быть проблемой симулятора Apple Watch. Теперь, как мне решить, чтобы я мог попытаться протестировать свое приложение? У меня остался только один, и тогда я могу опубликовать. Спасибо, Винченцо. 15.11.2016
  • Здравствуйте, я провел небольшое исследование в Интернете, и по этой ссылке у пользователя возникла та же проблема, что и у меня. stackoverflow .com/questions/39808319/ Это должно быть проблемой симулятора Apple Watch. Теперь, как мне решить, чтобы я мог попытаться протестировать свое приложение? У меня остался только один, и тогда я могу опубликовать. Спасибо, Винченцо. 15.11.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..