我有UIViewController
与UILabel
需要显示“lbs”或“kg”。我的应用程序有一个设置屏幕(另一个UIViewController
),通过第一个视图控制器以模态方式呈现,用户可以选择两个单元中的任意一个并保存其偏好。如果单位改变,模式设置屏幕被解散,我当然希望第一个视图控制器上的标签更新为新的单位值(但不刷新整个视图)。我以为我知道如何使它工作,但显然我没有。哪里在视图模式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
将被称为第二次,如果我在UINavigationController
管理的UITableViewController
的层次结构内工作,但在我解雇我的模态UIViewController
以显示它下面的UIViewController
时不会调用。
我有点停留在这一点上,而不是一定要尝试下一个是什么。
编辑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。我想知道你是否在错误的类中添加了代码。 –
另外,您能非常具体地描述底层视图控制器的视图层次结构吗?它是否在导航和/或标签控制器中? –
对不起,@AaronBrager。 'viewDidLoad'在第一个视图控制器中。当我删除了一堆多余的代码时,我错误地删除了'override'和'super.viewDidLoad'。我已经纠正了上述情况。我还添加了视图层次结构的屏幕截图。 – Jim