Ios6 iOS 6 UIWebView状态恢复是如何工作的?

Ios6 iOS 6 UIWebView状态恢复是如何工作的?,ios6,uiwebview,restore,state-restoration,Ios6,Uiwebview,Restore,State Restoration,根据: 在iOS 6及更高版本中,如果您为该视图的restorationIdentifier属性指定了一个值,它将尝试保留其URL历史记录、每个页面的缩放和滚动位置,以及当前正在查看的页面的相关信息。在恢复过程中,视图将恢复这些值,以便web内容与以前一样显示 我正在做这些,但什么也没发生。即使我手动保存并恢复用户以前查看的URL,滚动位置也不会恢复。这些文件是错的吗?这些文件是对的,但非常不完整。事情是这样的。如果一个web视图参与了状态恢复(我假设你知道这意味着什么-一切都必须有一个rest

根据:

在iOS 6及更高版本中,如果您为该视图的restorationIdentifier属性指定了一个值,它将尝试保留其URL历史记录、每个页面的缩放和滚动位置,以及当前正在查看的页面的相关信息。在恢复过程中,视图将恢复这些值,以便web内容与以前一样显示


我正在做这些,但什么也没发生。即使我手动保存并恢复用户以前查看的URL,滚动位置也不会恢复。这些文件是错的吗?

这些文件是对的,但非常不完整。事情是这样的。如果一个web视图参与了状态恢复(我假设你知道这意味着什么-一切都必须有一个
restorationIdentifier
,等等),并且如果用户离开应用程序时web视图有一个请求(不是HTML字符串),web视图将自动恢复使用,其中包含与其
request
属性相同的请求,并且其返回和转发列表保持不变。因此,您可以使用状态恢复机制来恢复web视图的状态,但您必须执行一些额外的操作。这种舞蹈是如此的奇怪和晦涩,以至于最初我的印象是web视图的状态无法真正保存和恢复,尽管文档断言它可以

这里有两个秘密;了解它们后,您将了解web视图状态恢复:

  • 还原的web视图不会自动加载其请求;这取决于你的代码

  • 在还原的web视图加载其请求后,其返回列表中的第一项是处于用户离开状态的同一页面(滚动和缩放)

知道了这一点,您就可以很容易地设计出web视图状态恢复的策略。第一件事是检测到我们正在恢复状态,并升起一面这样的旗帜:

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder {
    [super decodeRestorableStateWithCoder:coder];
    self->_didDecode = YES;
}
现在,我们可以检测(可能在
视图中显示:
)我们正在恢复状态,并且web视图神奇地包含一个请求,并加载该请求:

if (self->_didDecode && wv.request)
    [wv loadRequest:wv.request];
现在是棘手的部分。加载视图后,我们立即“返回”。这实际上具有恢复用户以前的滚动位置(以及从后堆栈顶部删除额外条目)的效果。然后我们降下国旗,这样我们就不会在其他任何时候采取额外的行动:

- (void)webViewDidFinishLoad:(UIWebView *)wv {
    if (self->_didDecode && wv.canGoBack)
        [wv goBack];
    self->_didDecode = NO;
}

UIWebView现在处于用户先前离开应用程序时的状态。我们使用内置的iOS 6状态保存和恢复功能保存和恢复了状态。

我尝试了Matt的答案,效果很好,但是如果历史堆栈中有“转发”页面,它们将被web视图对象中的还原请求替换

更好的方法是在webview对象上调用“reload”方法,这将恢复两个方向的历史以及缩放和内容滚动偏移


如果您想了解我的方法或您自己的webview的更多功能,请查看我的开源SVWebViewController分支

,我不知道这是否是web视图的一个怪癖,但在
[wv goBack]
之后,测试
[wv canGoBack]
仍然一次又一次返回
YES
。在历史记录中只有一个页面的web视图(iOS 6.1.4)上尝试过。是否有任何项目可以使用此功能?如果你不能满足好奇心,你怎么能把一个好问题变成一个复杂的、令人费解的问题,然后用一个全面的、非常详细的自我回答迅速地把它抹掉呢?所有这些都是在2分钟内完成的?美好的这个把戏的SO徽章在哪里?@GregCombs“如果你有一个你已经知道答案的问题,并且你想公开记录这些知识,以便其他人(包括你自己)以后可以找到它,那么在Stack Exchange站点上问和回答你自己的问题完全可以。”-当然,你错过的是在发布问答之前,在这个问题上花了数周的时间。哈哈,明白了!我真高兴你这么做了!这比我的答案好!每个人都应该阅读Matt的答案,以了解发生了什么以及代码显示的方向。只需将他的“loadRequest”调用替换为“reload”。