UserDefault не обновляется в контроллере основного представления - PullRequest
0 голосов
/ 06 мая 2020

Я создаю простое приложение-счетчик, в котором пользователь может установить максимальное количество посетителей, разрешенных в их месте работы, и когда это число будет достигнуто, им выдается уведомление о том, что они работают на максимальной мощности. Я использую UserDefaults для хранения этих данных, однако всякий раз, когда я обновляю максимальное число в настройках и возвращаюсь в основное представление, он все еще использует предыдущее максимальное число. Если я закрою приложение и снова открою, в нем будут правильные данные. Как мне убедиться, что данные обновляются в контроллере основного представления, чтобы он получал правильные данные?

Код

ViewController.swift (контроллер основного представления)

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    
    var counter = 0;
    var max = UserDefaults.standard.integer(forKey: "max");
    

    
    // Max patron alert function
    func showAlert() {
        let alertController = UIAlertController(title: "Limit Reached", message: "Your place of business has reached maximum capacity, please stop patrons from entering until capacity dissipates.", preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Dismiss", style: .default))
        
        self.present(alertController, animated: true, completion: nil)
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
    }

    @IBOutlet weak var count: UILabel!
    
    @IBAction func increment(_ sender: UIButton) {
        
        if counter < max {
            counter += 1;
            count?.text = String(counter);
        }
            
        
        if counter == max {
            showAlert();
        }
    }
    
    
    @IBAction func decrement(_ sender: UIButton) {
        if (counter == 0) {
            counter += 0;
        }
        else {
            counter -= 1;
        }
        count?.text = String(counter);

    }
    
    @IBAction func reset(_ sender: UIButton) {
        counter = 0;
        
        count?.text = String(counter);
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
//        UserDefaults.standard.synchronize()
        // Do any additional setup after loading the view.
    }
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

SettingsViewController.swift


import UIKit


class SettingsViewController: UIViewController {
    
    var mainViewController:ViewController?;

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    
    @IBOutlet weak var maxOccupancy: UITextField!
    

    @IBAction func save(_ sender: UIButton) {
        let max = Int(maxOccupancy.text!);
        
        UserDefaults.standard.set(max, forKey: "max")
        UserDefaults.standard.synchronize()
        print(UserDefaults.standard.integer(forKey: "max"))
    }
    
    
    
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Эта строка:

var max = UserDefaults.standard.integer(forKey: "max")

выполняется только один раз, когда создается ViewController. (Кстати: точка с запятой в Swift не нужна). Что бы ни случилось с UserDefaults впоследствии, это не отразится на его значении.

Замените строку на

var max: Int {
    UserDefaults.standard.integer(forKey: "max")
}

, чтобы каждый доступ к ней фактически выходил для получения значения из UserDefaults.

Эти конструкции называются «вычисляемыми свойствами», здесь объясняется .

1 голос
/ 06 мая 2020

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

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        max = UserDefaults.standard.integer(forKey: "max")
    }

Кроме того, нет необходимости использовать ; в конце каждой строки, Swift этого не требует.

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