存储&在UIWebView中检索动态页面的HTML字符串

时间:2012-03-20 23:35:11

标签: iphone html dynamic uiwebview plist

我正在为iPhone编程,创建一个应用程序,在UIWebView中显示各种本地存储的HTML页面。所有页面在结构和样式上都是相同的,唯一的区别在于它们的内容。

现在我用“Master View”(UITableView)编程,当用户选择一个单元格时,整个导航控制器将“Detail View”推送到包含UIWebView的堆栈。显示详细信息视图时,将加载其WebView HTML内容。

由于所有页面在结构上都是相同的,我认为设置HTML模板页面并加载文本会更简单。根据我的理解,这就是PHP的工作原理。用户为项目加载亚马逊页面,每个页面都具有相同的结构和样式,但PHP代码会提取该特定项目的标题,描述等。

我想知道在带有UIWebView的iPhone上执行此操作的最佳方法。由于我不是网络向导而且不熟悉Javascript,更不用说PHP了,我的想法是:

将HTML模板从本地文件加载到NSString对象中。该模板包含带有特殊ID的标签,以指示文本的位置。使用NSString find&替换方法以定位每个特殊标记并插入适当的文本片段。

编程很简单,我相信它也会非常高效,特别是因为我在加载页面时只做了4-5次替换。如果有人有更好的建议(尤其是彻底的建议),我不介意听到它。

现在,这不是我的问题。我更想知道存储和检索将插入模板的多行HTML字符串的最佳方法是什么。据我所知,在普通网页上,PHP会检索XML文件的各个部分,或者对SQL数据库进行查询。

我在iPhone上熟悉的两种数据存储/检索方法是Plist文件和字符串文件。字符串文件对我来说似乎相当方便,因为它们可以存储多行字符串,除了我必须在字符串中的任何地方转义每个双引号(并且有一些,因为它是HTML)并且字符串文件似乎是专门设计的Apple为国际化而非动态网页。

对于Plist文件,您可以轻松拥有一个字符串数组,但它不是多行友好的。最新XCode中的Plist编辑器一次只显示一行,使得使用起来有点烦人,再一次让我觉得我反对Apple通过填充大量字符串来打算使用Plist。其次,我可以找到从Plist中读取数据的唯一方法是将整个内容加载到NSData中或将其序列化为对象等等。我觉得每次我需要重新配置我的UIWebView时重新序列化Plist是愚蠢的,浪费内存来序列化Plist并在我的应用程序运行的整个时间内将结果对象保存在内存中。我认为它不能占用那个很多内存,因为它只是文本,但我不太确定。

可能不是在将HTML传递到WebView之前改变HTML,我应该在HTML中使用模板Javascript从本地XML文件中提取字符串(而Objective-C只是将关键字符串解析为在将HTML提供给WebView之前的JS,以便WebView的JS逻辑进行实际的替换。但是,我真的不知道如何做到这一点,我发现的AJAX教程总是提到外部服务器,我不知道如何使用UIWebView的脚本库等。

最后,我会感谢任何有关如何实现这一目标的建议。无论你的建议是什么,越详细越好。

1 个答案:

答案 0 :(得分:1)

  

据我所知,在普通网页上,PHP会检索XML文件的各个部分,或者对SQL数据库进行查询

没有。嗯,是的,它可能。但PHP可以输出任何东西。与Objective-C非常相似。

  

我在iPhone上熟悉的两种数据存储/检索方法是Plist文件和字符串文件。

这些只是Apple传播的特殊格式。您可以使用任何所需的文件格式。使用stringWithContentsOfFile

  

每次我需要重新配置我的UIWebView时,我觉得重新序列化Plist是愚蠢的,浪费内存来序列化Plist,并在我的应用程序运行的整个时间内将结果对象保存在内存中。

你没有太多选择。另一种方法:使用磁盘缓存。首次访问时,将渲染的模板保存为文件。下次检查是否存在缓存文件。

  

可能不是在将HTML传递到WebView之前改变HTML,我应该...... WebView的JS逻辑可以实际替换它。

这可能是一个坏主意。 JS比Obj-C慢得多,内存更多。此外,JS无法做到,Obj-C也无法做到。

如果您不担心不可避免的开销,可以考虑使用功能齐全的templating engine