У меня есть UIViewController
с UILabel
, который должен отображать либо «фунты», либо «кг». В моем приложении есть экран настроек (еще один UIViewController
), который представлен модально над первым контроллером представления, и пользователь может выбрать любой из двух блоков и сохранить свои предпочтения. Если единицы изменены и экран модальных настроек закрыт, я, конечно, хочу, чтобы метка на первом контроллере представления была обновлена с новым значением единиц (но без обновления всего представления). Я думал, что знаю, как заставить его работать, но, очевидно, это не так.
На моем экране модальных настроек у меня есть UISegmentedControl
, чтобы пользователь мог выбирать единицы измерения. Всякий раз, когда он изменяется, эта функция обновляет userDefaults
:
func saveUnitsSelection() {
if unitsControl.selectedSegmentIndex == 0 {
UserDefaultsManager.sharedInstance.preferredUnits = Units.pounds.rawValue
} else {
UserDefaultsManager.sharedInstance.preferredUnits = Units.kilograms.rawValue
}
}
Тогда они, скорее всего, закроют экран настроек. Итак, я добавил это к viewDidLoad
в моем первом контроллере представления:
override func viewDidLoad() {
super.viewDidLoad()
let preferredUnits = UserDefaultsManager.sharedInstance.preferredUnits
units.text = preferredUnits
}
Это не сработало, поэтому я переместил его на viewWillAppear()
, и это тоже не сработало. Я провел некоторое исследование и отладку пещерного человека и обнаружил, что ни одна из этих функций не вызывается после того, как представление было загружено/представлено в первый раз. Кажется, что viewWillAppear
будет вызываться во второй раз, если я работаю в иерархии UITableViewController
, управляемой UINavigationController
, но не вызывается, когда я закрываю свой модальный UIViewController
, чтобы показать UIViewController
под ним.
Изменить 1: вот иерархия представлений, с которой я работаю:
Я немного застрял на этом этапе и не знаю, что делать дальше.
Редактировать 2: пользователь может нажать кнопку «Готово» на панели навигации, и когда они это сделают, функция dismissSettings()
закроет представление «Настройки»:
class SettingsViewController: UITableViewController {
let preferredUnits = UserDefaultsManager.sharedInstance.preferredUnits
// some other variables set here
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.topItem?.title = "Settings"
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(self.dismissSettings(_:)))
if preferredUnits == Units.pounds.rawValue {
unitsControl.selectedSegmentIndex = 0
} else {
unitsControl.selectedSegmentIndex = 1
}
}
func dismissSettings(sender: AnyObject?) {
navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
}
func viewDidLoad()
? Если бы это было в контроллере представления, Xcode должен пожаловаться, что вы не объявилиoverride
, и вы должны вызвать super. Интересно, вы добавляете код не в тот класс? - person Aaron Brager   schedule 05.08.2016viewDidLoad
находится в первом контроллере представления. И я по ошибке удалилoverride
иsuper.viewDidLoad
, когда удалил кучу лишнего кода. Я исправил это выше. Я также добавил скриншот иерархии представлений. - person Jim   schedule 05.08.2016