需要说明的是,UIWebView状态恢复(与正常状态恢复类似)的步骤如下:
- 在您的应用委托
application: shouldRestoreApplicationState
中,application: shouldSaveApplicationState
返回 true。
- 呈现的视图控制器 - 设置其恢复 ID - 您可以在情节提要的身份检查器中进行。ID 可以是任何唯一的字符串。如果您有容器 VC(导航等),则需要为其设置恢复 ID。
- 在情节提要中为 UIWebView 设置恢复 ID
- 覆盖
applicationFinishedRestoringState
并重新加载webView
我使用了这些步骤,一切似乎都奏效了。但是,在阅读了您的评论后,我发现您在缩放页面时遇到了问题。问题是 UIWebView 恢复中的一个错误(我认为),它与重新加载机制有关。这就是为什么我建议以下 hack:
import UIKit
class ViewController: UIViewController, UIWebViewDelegate {
@IBOutlet var webView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView.delegate = self
webView.scrollView.restorationIdentifier = "webViewScrollView"
}
var restoring = false
override func viewDidAppear(animated: Bool) {
if !restoring {
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://google.com")!))
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
var restoredScrollOffset: CGPoint = CGPoint.zeroPoint
override func applicationFinishedRestoringState() {
restoring = true
restoredScrollOffset = webView.scrollView.contentOffset
webView.reload()
}
func webViewDidFinishLoad(webView: UIWebView) {
if restoring {
restoring = false
if webView.scrollView.contentOffset != restoredScrollOffset {
println("bug - sometimes it may happen")
}
webView.scrollView.contentOffset = restoredScrollOffset
}
}
因为这是一个黑客,我们不能确定它会完美无瑕:)
请注意,我在 webview 中设置了滚动视图的恢复标识符,这样我就不必实现 VC 编码功能 - 可以通过 VC 编码/解码覆盖仅编码滚动视图偏移量。
我只设置滚动视图偏移;如果缩放比例有问题(我在我尝试过的任何网页中都没有找到),你可以在我设置滚动视图的内容偏移的同一个地方设置比例
代码在https://github.com/iamdoron/UIWebViewRestoration