[已解决]我尝试使用恢复状态协议来检索我的代码中以编程方式构建的内容,我的语法很好,但似乎它不起作用。 在我的代码中,我开发了一个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)
它有效:)感谢您的帮助
答案 0 :(得分:0)
从评论中看,您似乎已成功将图片加载到testpost
,因此恢复正常。但问题是,您从未运行任何代码将testpost
添加到view
或设置testpost
的框架。存储在图像视图中的图像只是您需要恢复的状态的一部分。
如果您将以下内容添加到decodeRestorableState
,您应该会看到您期望的内容,至少对于单个图片而言:
x1 = x1 + 30
testpost.frame = CGRect(x: x1,y: 0,width: 240,height: 240)
view.addSubview(testpost)
您的代码目前无法处理多次按下按钮的情况(始终只显示零个或一个图像),但您应该可以从此处开始工作。