我有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