отдельный класс для хранения входных данных

#ios #swift #xcode

#iOS #swift #xcode

Вопрос:

Вот следующий код:

 class settings {

     static let SharedInstance = settings()
     var city: String {
        return self.city
     }
}
  

прямо сейчас я могу получить доступ к этому классу из отдельного представления, подобного этому:

 @IBOutlet weak var cityLabel: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    cityLabel.text = settings.SharedInstance.city
}
  

но я хочу иметь возможность изменять значение city в моем settings классе «» из другого представления.

Что-то вроде:

 @IBOutlet weak var city: UITextField!
@IBAction func saveButtonClicked(_ sender: AnyObject) {
  settings.SharedInstance.cityVar(city.text)  
  closeKeyboard()
}
  

Я не знаю, как отсюда добраться

Моя логика заключается в том, чтобы инициировать a setter внутри my class или, может быть, a function , который принимает a string и изменяет переменную, как я пытался сделать выше.

Обновить

Теперь я могу установить и получить название города в этом классе:

 class settings {

   static let SharedInstance = settings()

   var city: String?
   func setCity(city: String){

       self.city = city
   }

}
  

Проблема сейчас в том, что когда я обращаюсь к переменной city в моем классе «настройки» в другом представлении, она не отображает новое значение :

     override func viewDidLoad() {
        super.viewDidLoad()
        cityLabel.text = settings.SharedInstance.city

     }
  

Я считаю, что он не обновляет представление

Комментарии:

1. настройки класса { private var _x : Int = 0 var x : Int { set { _x = 2 * newValue } get { return _x / 2 } } } попробуйте этот способ

Ответ №1:

Если вы используете следующую строку:

 var city: String {
    return self.city
}
  

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

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

 class settings {

    static let SharedInstance = settings()

    var city: String?

}
  

Тогда вам не нужно создавать инициализаторы для класса. Если вы также хотите создать метод установки в классе, тогда вы можете, например:

 func setCity(city: String){
    self.city = city
}
  

Это означает, что теперь будет работать следующий метод:

 class myClass: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        cityLabel.text = settings.SharedInstance.city
        settings.SharedInstance.city = cityLabel.text
    }

}
  

Комментарии:

1. хм, ну, вы правы, нет смысла использовать его как «только для получения» — я попробовал ваш код, и он работает, ЕСЛИ я объявляю var city = «что-то», похоже, он не понимает, если я устанавливаю свой город из своего представления следующим образом: @IBAction функция saveButtonClicked(_ sender: AnyObject) { настройки. sharedInstance.setCity(город: city.text!)

2. Какую ошибку он выдает для этого кода? Я не вижу, что не так с этой реализацией.

3. никаких ошибок, что так когда-либо 🙂 Он просто ничего не делает, когда я ввожу в поле ввода и нажимаю свою кнопку.

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

5. я думаю, это потому, что он не обновляется в моем другом представлении, например. переопределить функцию viewDidLoad() { super.viewDidLoad() cityLabel.text = настройки. sharedInstance.city }