Проблема в обновлении значения из `UserDefaults` в Swift - PullRequest
0 голосов
/ 16 мая 2018

Я отправляю строковое значение с моего vc2 на vc1 через UserDefaults.Но когда я возвращаюсь к vc1 с vc2 через кнопку назад, значение не обновляется.Я получаю значение в vc1 в viewWillAppear метод.Но моя ценность не обновляется.Я перемещаюсь от vc1 к vc2 с помощью метода push.

Вот как я сохранил значение по умолчанию для пользователя в vc2,

  cartItems = cartItems + 1
  print(cartItems)
  let badgeCount = String(cartItems)
  print(badgeCount)
  let rightBarButton = self.navigationItem.rightBarButtonItem
  let badge = String(badgeCount)
  rightBarButton?.addBadge(text: badge)
  UserDefaults.standard.set(badgeCount, forKey: "cartsItems")
  UserDefaults.standard.synchronize()

, а в vc1 я получаю вот так в делегате viewWillAppear,

 let count =  UserDefaults.standard.string(forKey: "cartsItems")
 print(count)

Когда я возвращаюсь к vc1 с vc2 через значение кнопки назад, никогда не обновляюсь, и когда я вызываю какой-то другой vc и потом снова вызываю vc1, он получает обновление.Как я могу обновить значение в это время?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Я пытаюсь сделать что-то похожее на то, что вы делаете. Я перевожу приложение на другие языки (локализация). Поэтому, когда я выбираю один язык на VC2, я возвращаюсь к VC1, и строки в VC1 должны обновляться в соответствии с выбранным языком.

Язык сохраняется в Userdefaults ().

Я думаю, я знаю, почему у вас возникла эта проблема. Чтобы понять, что происходит, попробуйте написать это в VC1:

let count =  UserDefaults.standard.string(forKey: "cartsItems") // I suppose this is a global variable.
override func viewWillAppear(_ animated: Bool) {

    print("This is the value of the global variable: \(count)")
    print("This is the value of Userdefaults directly: \(UserDefaults.standard.string(forKey: "cartsItems"))")     

}

Вы ожидаете, что оба результата будут одинаковыми. Однако первый из глобальной переменной не будет обновлен; тогда как второй, напрямую использующий Userdefaults, обновляется.

Я полагаю, это потому, что когда вы загружаете VC1, представление загружается и переменные получают свои значения. Когда вы открываете VC2, он открывается над VC1. Когда вы возвращаетесь в VC1, вы не загружаете его снова, а возвращаетесь к тому, что уже загружено. И глобальная переменная остается с тем же значением, что и в начале.

Надеюсь, это поможет.

0 голосов
/ 16 мая 2018

Ну, правильный способ сделать это с помощью простого протокола делегирования для передачи данных из одного VC2 в другой VC1.

Ниже приведены инструкции по работе с protocol.

В VC2 `выполните следующие шаги.

Чуть выше объявления вашего класса объявите вашего делегата.

protocol MyDelegate:class {
    func sendDataBack(value: Int)
}

В class объявите weak variable вашего delegate

weak var myDelegateObj: MyDelegate?

и когда вы dismiss the VC просто вызываете делегата со строкой

myDelegateObj?.sendDataBack(value: yourIntegrerValue)

Теперь перейдите к вашему VC1 и перейдите на линию, где вы нажали VC1 на VC2 и сделайте следующее.

vc2.myDelegateObj = self // vc2 is VC2 objcet

и реализуйте метод вашего делегата в VC1

func sendDataBack(value: Int) {
     print(value)   
 }

Надеюсь, это поможет.

...