Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么我能';是否将WKWebView保存到[NSUserDefaults standardUserDefaults]?_Ios_Objective C_Iphone_Nsuserdefaults_Wkwebview - Fatal编程技术网

Ios 为什么我能';是否将WKWebView保存到[NSUserDefaults standardUserDefaults]?

Ios 为什么我能';是否将WKWebView保存到[NSUserDefaults standardUserDefaults]?,ios,objective-c,iphone,nsuserdefaults,wkwebview,Ios,Objective C,Iphone,Nsuserdefaults,Wkwebview,上面的代码是用来保存WKWebView对象的,但我遇到了一个编译器错误: 2014-11-08 14:58:52.561恢复[2431:482391]属性列表无效 对于格式:200(属性列表不能包含类型为的对象 “CFType”)2014-11-08 14:58:52.564恢复[2431:482391]尝试 将非属性列表对象>设置为 NSUserDefaults/CFKeyWebView的首选项值2014-11-08 14:58:52.566恢复[2431:482391]*由于以下原因终止应用

上面的代码是用来保存WKWebView对象的,但我遇到了一个编译器错误:

2014-11-08 14:58:52.561恢复[2431:482391]属性列表无效 对于格式:200(属性列表不能包含类型为的对象 “CFType”)2014-11-08 14:58:52.564恢复[2431:482391]尝试 将非属性列表对象>设置为 NSUserDefaults/CFKeyWebView的首选项值2014-11-08 14:58:52.566恢复[2431:482391]*由于以下原因终止应用程序 未捕获异常“NSInvalidArgumentException”,原因:“尝试 为键webView'插入非属性列表对象> *第一次抛出调用堆栈:(0x2c491c1f 0x39c78c8b 0x2c491b65 0x2c4cbe51 0x2c436599 0x2c4358d7 0x2c4cc0d1 0x2c4cb769 0x2c4ce95b 0x2c4ce875 0x2d0eab69 0x66bdf 0x2f981c2b 0x2f981bd1 0x2f96c863 0x2f98163d 0x2f981317 0x2f97abe1 0x2f9513dd 0x2fbc4c29 0x2f94fe39 0x2c458377 0x2c457787 0x2c455ded 0x2c3a4211 0x2c3a4023 0x3379d0a9 0x2f9b01d1 0x66ead 0x3a1f8aaf)libc++abi.dylib:终止于 NSException类型的未捕获异常

如何保存WKWebView并将其还原为完整的历史记录

编辑:

8个月过去了,这个问题没有解决办法

编辑2:

我正在制作一个web浏览器,当用户重新启动应用程序时,关键是要恢复web视图(选项卡),这样他就可以按下后退按钮并返回

如果我将以前的URL保存在一个简单的列表中,当应用程序重新启动时,我无法将它们放回web视图。我只能加载第一页。因此,用户不能按back键,因为没有要返回的页面。如果它像保存URL列表一样简单,我就不会开始悬赏了。因为,web浏览器是一个非常复杂的应用程序,我已经非常接近WebView的基本原理,我甚至提交了3个bug,其中只有2个已经解决。包括臭名昭著的


standardUserDefaults方法确实适用于UIWebView,但苹果表示,在iOS 7发布后,所有开发人员都应该使用WKWebView。我预计UIWebView在不久的将来会被弃用。

您只能在NSUserDefaults中存储某些类型的对象,即

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

[prefs setObject:self.webView forKey:@"webView"];
(将webview放在NSArray中无法绕过此问题)

您可以做的是将有关webview的相关信息存储在NSDictionary中,这样您就可以在从NSUserDefault加载时将webview恢复到当前状态


有关更多详细信息,请参阅

,如果您确实希望使用用户默认设置的webview,这里有一个选项

NSArray
NSData
NSDate
NSDictionary
NSNumber
NSString
作为@fonix,您只能在
NSUserDefault
中存储部分数据类型

如果您只需要url,那么将其转换为字符串并将其保存到
NSUserDefaults
将非常容易

然而,问题的关键是如何“恢复
WKWebview
的历史完整性。”

由于要“保存”web视图,您不仅需要显示当前URL,还需要显示历史记录,因此需要访问
WKWebview上的
backForwardList

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:[NSKeyedArchiver archivedDataWithRootObject:self.webView] forKey:@"webView"];

// get it back from user default
NSData *data = [prefs objectForKey:@"webView"];
self.webView = [NSKeyedUnarchiver unarchiveObjectWithData:data];
将这些URL保存到
NSArray
,将允许您将它们保存到
nsserdefaults


然后,当您想要“重新创建”webview时,遍历该数组并请求每个url来模拟历史


希望这有帮助

这里没有简单的答案。WKWebView无法存档,也不参与UI状态保存/恢复。你已经发现了这个

对于iOS版Firefox,我们采取了不同的方法来克服这些限制。这远非理想,但确实有效

当我们还原附加了会话信息(以前访问过的页面)的选项卡时,我们从本地web服务器(在本地主机上运行)加载一个特殊的html页面,该页面修改页面的推送状态,并在历史堆栈上推送以前访问过的URL

因为这些URL需要来自同一个来源,所以我们基本上推送URL,就像`

在我们的UI中,我们将其转换为显示
original.url.com
。当用户返回历史以加载这些页面时,我们会截取并加载原始页面,而不是从localhost加载页面

这是一个很大的难题,但这就是我们目前所拥有的一切


参见

上的源代码,这并不能完全回答这个问题。您可以解释如何保存然后还原webview。除此之外,这不适用于NSUserDefault,答案是正确的。您通常应该将非plist数据保存到文件中。这是因为没有明显的方法序列化web视图对象。如何在文件中存储视图?序列化是针对数据的。可序列化的结构化数据。不适用于任意用户界面对象。还原webview时,您希望看到什么行为?如果你想让它简单地还原当前和过去的页面URL,那么你可以将它们保存到NSUserDefaults中作为NSStrings。你在这里找到了我,在我找到它之后,它不再是self.view的子视图。我重置了它的属性,例如委派,并将其添加为self的子视图。view,它对我有效,我加载了一个视频并播放了它,但这是在UIWebView上进行的测试。是的,正如您所述,它对UIWebView有效,但WKWebView似乎无法恢复。WKWebView是新事物,苹果公司将在未来使其更好。但是,但是。。。我今天就需要它:(我以前想过,但我认为这对于一个很少发生的事件来说太复杂了。我从来没有打开过浏览器并单击“后退”按钮。谁会这样做?你要么浏览你的最后一页,上一节课的一页,要么转到一个新的页面。“现代”web浏览器的导航系统有缺陷,倾向于使用易于回收的选项卡。@User37190同意。但请记住,操作系统也会在需要时暂停/恢复您的应用程序。因此,它可能不是一个e
    NSMutableArray *history = [NSMutableArray array];
    for(WKBackForwardListItem *item in webview.backForwardList.backList){
       // use -absoluteString to convert NSURL to NSString
       [history addObject:[item.url absoluteString]];
    }

   [[NSUserDefaults standardUserDefaults] addObject:history forKey:@"webviewHistory"];
   [[NSUserDefaults standardUserDefaults] synchronize];