0

オプションのリストを表示する 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()

4

1 に答える 1

0

UIViewController への単一の参照を使用して、質問のコードをより管理しやすいものに減らしました。でも構造は同じです。さらに迅速性を追加することもできますが、私は別のアプローチ、またはこのアプローチが推奨される方法であることの確認にもっと興味があります。

class SettingsViewController:UITableViewController {

var isRestoration = false
var childVC:UIViewController?

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
        forgetChild()
    }
}

override func restoreChildIfPresent() {
    if let childVC = childVC {
        self.navigationController?.pushViewController(childVC, animated:false)
    }
}

func forgetChild() {
    childVC = nil
}

override func prepareForSegue(segue:UIStoryboardSegue, sender:AnyObject?) {
    childVC = nil
    if segue.identifier == "aboutSegue" {
        childVC = segue.destinationViewController    
    } else if segue.identifier == "feedbackSegue" {
        childVC = segue.destinationViewController
    }
}

override func decodeRestorableStateWithCoder(coder:NSCoder) {
    isRestoration = true
    childVC = coder.decodeObjectForKey("childVC")
    super.decodeRestorableStateWithCoder(coder)
}

override func encodeRestorableStateWithCoder(coder:NSCoder) {
    coder.encodeObject(childVC, forKey:"childVC")
    super.encodeRestorableStateWithCoder(coder)
}
于 2015-12-02T11:53:54.123 に答える