オプションのリストを表示する UITableViewController があります。各オプションをタップすると、セグエを使用して別のView Controllerに移動します
アプリの状態を復元するには、次のコードが必要です。しかし、よりクリーンな方法はありますか?リストに 2 つのオプションを処理するコードを含めましたが、画像は 10 個のオプションです!
class SettingsViewController:UITableViewController {
var isRestoration = false
var aboutVC:AboutViewController?
var feedbackVC:FeedbackViewController?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if isRestoration {
isRestoration = false
restoreChildIfPresent()
} else {
// nullify so when child is closed, we don't reopen
// on next restoration
forgetChildren()
}
}
override func restoreChildIfPresent() {
if let aboutVC = aboutVC {
self.navigationController?.pushViewController(aboutVC, animated:false)
} else if let feedbackVC = feedbackVC {
self.navigationController?.pushViewController(feedbackVC, animated:false)
}
}
func forgetChildren() {
aboutVC = nil
charterVC = nil
feedbackVC = nil
}
override func prepareForSegue(segue:UIStoryboardSegue, sender:AnyObject?) {
aboutVC = nil
feedbackVC = nil
if segue.identifier == "aboutSegue" {
aboutVC = segue.destinationViewController as? AboutViewController
} else if segue.identifier == "feedbackSegue" {
feedbackVC = segue.destinationViewController as? FeedbackViewController
}
}
override func decodeRestorableStateWithCoder(coder:NSCoder) {
isRestoration = true
aboutVC = coder.decodeObjectForKey("aboutVC") as? AboutUsViewController
feedbackVC = coder.decodeObjectForKey("feedbackVC") as? FeedbackViewController
super.decodeRestorableStateWithCoder(coder)
}
override func encodeRestorableStateWithCoder(coder:NSCoder) {
coder.encodeObject(aboutVC, forKey:"aboutVC")
coder.encodeObject(feedbackVC, forKey:"feedbackVC")
super.encodeRestorableStateWithCoder(coder)
}
子 VC は埋め込まれていないため、encodeObject() する必要があることに驚いています (UITabbarController に埋め込まれている場合は、encodeObject() 子が必要です)。
私の主な「嫌いな点」はrestoreChildIfPresent()
、ViewControllers の追加と醜い必要性によって成長するものです。forgetChildren()