代码改变世界

UIStateRestoration

2019-02-11 15:48  法子  阅读(575)  评论(0编辑  收藏  举报

用户把app切换到后台,内存原因或过段时间后,IOS系统选择关闭掉应用。UIStateRestoration可以恢复页面状态,让用户没有察觉到App在后台被IOS杀掉了。

(用户正常关闭App的时候,状态恢复是不起作用的)

1.AppDelegate.swift

    //返回true,则需要恢复状态的页面才会调用系统函数- (void) encodeRestorableStateWithCoder:(NSCoder *)coder
    func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool {
        return true
    }
    
    //返回true,则需要恢复状态的页面才会调用系统函数- (void) decodeRestorableStateWithCoder:(NSCoder *)coder
    func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
        return true
    }

2.页面UI恢复。

只是Storyboard页面恢复,不包含数据。需要为要恢复的页面设置Restoration ID。(如果要恢复状态的页面是多层页面中的一个,例如push或show多层,该页面下面的页面不设置,将影响本页面不能恢复状态;该页面上面的不设置,则即使在上层页面退到后台,也最多恢复到本页面)

3.数据恢复。

重写系统函数,存储并恢复数据,然后刷新UI。

若不重写这两个函数,只会恢复成Storyboard里的UI界面,而不能有数据的存储与恢复。

    //存储数据,进入后台调用
    override func encodeRestorableState(with coder: NSCoder) {
        super.encodeRestorableState(with: coder)
        coder.encode(self.restoreLabel.text, forKey: "RestoreKey")
    }
    //恢复数据,回到前台调用
    override func decodeRestorableState(with coder: NSCoder) {
        super.decodeRestorableState(with: coder)
        if let string = coder.decodeObject(forKey: "RestoreKey") as? String {
            self.restoreLabel.text = string
        }
    }

4.测试。

运行->跳转到该页面->修改lable的文字->退到后台->结束调试->重新运行->直接进入到该页面,label的文字为上次修改的文字。