iOS中的恢复状态

时间:2017-05-01 19:35:35

标签: ios swift uiimageview

[已解决]我尝试使用恢复状态协议来检索我的代码中以编程方式构建的内容,我的语法很好,但似乎它不起作用。 在我的代码中,我开发了一个UIButton,当我点击它时会创建一个UIImageView,但是当我杀死应用程序然后回来时,创建的UIImageView就不再存在了。 这是代码:

class ScrollViewController: UIViewController, UIScrollViewDelegate {
var x1 = 200
var testpost = UIImageView()

override func viewDidLoad() {
    super.viewDidLoad()

    let addButton = UIButton(frame: CGRect(x: 10, y: 20, width: 100, height: 40))
    addButton.backgroundColor = .black
    addButton.setTitle("add a note", for: .normal)
    addButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    self.view.addSubview(addButton)
    }

func buttonAction(sender: UIButton!) {
    x1 = x1 + 30
    testpost = UIImageView(frame:CGRect(x: x1,y: 0,width: 240,height: 240))
    testpost.image = UIImage(named:"Screenshots 2017-04-18 at 19.41.04")
    view.addSubview(testpost)
    testpost.restorationIdentifier = "testpostId"

}

override func encodeRestorableState(with coder: NSCoder) {
    if let imagge = testpost.image {
        coder.encode(UIImagePNGRepresentation(imagge), forKey: "testpostId")
    }
    super.encodeRestorableState(with: coder)

}
override func decodeRestorableState(with coder: NSCoder) {
    if let imagge2 = coder.decodeObject(forKey: "testpostId") as? Data {
        testpost.image = UIImage(data: imagge2)
        super.decodeRestorableState(with: coder)
    }}}

然而,我尝试使用滚动视图并且效果很好,当我在杀死它之后启动应用程序时,它在退出之前处于相同位置。

我还在AppDelegate中添加了这个:

 func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool {
    return true
}

func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
    return true
}

我还直接从故事板给了我的视图控制器一个恢复ID。 我没有任何错误,但没有任何保存。知道我的错误在哪里? 提前谢谢你!

解决方案,添加:

testpost.frame = CGRect(x: x1,y: 0,width: 240,height: 240)
view.addSubview(testpost)

super.decodeRestorableState(with: coder)

它有效:)感谢您的帮助

1 个答案:

答案 0 :(得分:0)

从评论中看,您似乎已成功将图片加载到testpost,因此恢复正常。但问题是,您从未运行任何代码将testpost添加到view或设置testpost的框架。存储在图像视图中的图像只是您需要恢复的状态的一部分。

如果您将以下内容添加到decodeRestorableState,您应该会看到您期望的内容,至少对于单个图片而言:

x1 = x1 + 30
testpost.frame = CGRect(x: x1,y: 0,width: 240,height: 240)
view.addSubview(testpost)

您的代码目前无法处理多次按下按钮的情况(始终只显示零个或一个图像),但您应该可以从此处开始工作。