文字重iOS应用。将文本存储在HTML,Plist或其他内容中?

时间:2014-09-17 23:29:19

标签: html ios objective-c nsattributedstring core-text

我正在编写相对复杂的iOS应用程序,它非常重。

文本格式也很重。它有很多颜色,大小,字体和间距的变化,以及您希望在一个非常丰富的网站上看到的项目符号列表和其他文本功能。

文本显示在大约40个不同的视图上。其中一些显示大量文本,另一些显示一些。所有页面都没有一个模板。 (有一些是相似的,但这不是重点。)

最后,编辑团队在开发期间不断更改和更新文本,而不是在发布后更新。文本必须存储在设备上,下载文件不是一个选项。

我的问题是,在iOS应用中存储然后呈现所有这些文字的最佳方式是什么?


我的方法

将所有文本内容和格式信息存储在html文件中并使用

[[NSAttributedString alloc] initWithFileURL:htmlDoc options:@{ NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType} documentAttributes:&attrDict error:&error];

创建NSAttributed字符串并使用它来填充UITextViews。*

*注意:在创建UITextViews之前,我会做更多的工作。首先我会解析它以找到合适的页码[[Page:1.3]],然后解析该部分[[header]],[[side_scroller]]等中的元素......

我喜欢这种方法有两个主要原因:

  1. 它创建了一个包含所有文本的单独副本文档 和格式化信息。

  2. 我是唯一的iOS开发者,但我们有一对前端 开发人员。因此,当我们受到抨击需要做的改变时 在3.45分钟内,我可以让一些人帮助我 变化,而不必知道UIFont和UIF的所有细微差别 相关课程。偶尔,编辑甚至可以做到 改变自己:)

  3. 喜欢这种方法的次要原因:

    • 每页的文本差别很大,创建一个新的UIFont + Plist条目来存储格式化信息似乎比在.html文档中包含所有内容更痛苦。 (我可能错了。)

    • 项目经理不可避免地会说:"让这个词变得更大," "这个词看起来很奇怪,加上斜体,"和#34;让一切变得紫红色!" HTML / CSS似乎是一种更灵活的解决方案,可以快速实现这些请求。

    这种方法的缺点:

    1. NSAttributedString获取了我投入的99%的HTML属性。它没有在无序列表<ul>中选择子弹间距更改。
    2. Plists的性能更高。
    3. 以下是我考虑过的其他一些方法:

      1. Plist + UIFont
      2. RTF文档 - 最初从这开始,但发现它隐藏了很多正在发生的事情,NSAttributedString不会接受一些更改。
      3. XML
      4. 非常感谢任何建议或意见。

        注意: iPad应用, IOS 7, 没有互联网连接, Xcode 5

2 个答案:

答案 0 :(得分:0)

我在iOS应用程序中存储样式文本的做法是编写一个Mac OS命令行工具,打开RTF文件并将它们转换为属性字符串(这是在Mac OS中的1行调用,但在iOS中不支持某些原因。)然后我使用NSCoding将属性字符串保存为二进制数据,并使用特殊的.DATA文件类型。

我使用一种方法创建了一个自定义UITextView类别,该方法知道如何从我的自定义文件类型加载文本视图的属性文本。

我在项目中创建了一个构建规则,它将RTF文件视为构建步骤中的源文件,将.DATA文件类型视为输出,并将.DATA文件复制到构建项目中。

现在,我所要做的就是在我的项目中添加一个RTF文件,构建过程将样式文本的.DATA版本插入到可执行文件中。

Xcode编辑器知道如何编辑RTF文件,因此您可以在IDE中正确编辑它们, OR 您可以在TextEdit或任何支持RTF文件的编辑器中编辑它们。

您可以在RTF中放置一些UITextViews不支持的内容。 (我不记得那些是随便的。抱歉。)

我发现样式的WYSIWYG文本比HTML更容易处理。您只需编辑文本,构建过程将获取更改。

它工作得很漂亮。另外,二进制NSCoding输出比HTML更紧凑。

答案 1 :(得分:0)

我建议使用网页浏览。它可以打开资源包中的文件。

您可以通过实现委托方法shouldStartLoadWithRequest来禁用HTML中的所有链接以返回NO。

您可能还想将dataDetectorTypes设置为UIDataDetectorTypeNone。 这将禁用Web视图中的自动链接检测