0

我已经从所有的搜索中头疼了。我不敢相信这是一个如此令人困惑的话题,因为我们创建的每个软件程序都必须能够保存用户输入,对吧。

问题出在:小说写作软件主窗口有tabnavigator,有四个navigatorcontent pages 1.characters,2.worlds,3.objects,4.Editor

每个 navigatorcontent 页面都有 textinput 组件、textarea 组件、richtexteditor 组件等形式的用户输入字段。

问题 1:用户需要能够打开一个新项目并给它一个名称和必须保存它的状态。Novel 写作软件程序中的所有用户输入都必须附加到用户指定的文件名 - 无法提供示例代码,因为我什至不知道从哪里开始查找。

问题 2:如果用户现在定义了一个新的项目名称,他所有来自不同输入组件的输入都必须编译成一个可以保存的文件。(Dan Pichelman 在使用 file.borwseforsave 函数时给了我一个满意的答案。)这是有道理的,但我首先需要将所有用户输入放入该单个文件中。我确信它必须是一个 xml 文件,并且会有关于如何执行此操作的指南,但是......

问题3:这给我带来了另一个问题。到目前为止,我研究过的所有页面都告诉我如何将 xml 文件中的数据加载到组件中,但没有告诉我如何将组件中的文本写入 xml 文件。而且这个xml文件不能是storage目录下的prefs文件,它必须由用户命名,然后在软件的不同选项卡中填写他的所有文本后,必须保存在这个xml文件中,并保存在用户所在的位置选择。

问题 4:现在用户输入了他的文本并将其写入了一个他命名并设置了路径的 xml 文件,他去度假并在两周内打开他保存的文件以再次处理他的项目。现在必须将存储在 xml 中的所有数据写回到不同的用户输入组件中,这样他才能继续处理他的项目,说实话,有一些关于这个主题的示例和教程,但同样来自一个页面透视不是多选项卡透视。

问题 5:现在用户已经删除和/或更改了他开始时输入的一些文本,他在 textareas 和 texteditor 中写了更多文本,然后单击文件 - 保存按钮。xml 文件或任何需要使用的文件必须更新并保存,所有更改都会覆盖旧文件。

问题 6:用户输入的数据最终会变成一本 400 页的书。这些数据显然主要在richtexteditor 组件中,因此无论使用什么保存方法,数据库或xml 或其他任何方法,都需要能够包含所有这些数据。

想一想,如果您正在使用例如 microsoft powerpoint,它有多个页面,所有页面都包含不同的用户输入,当您单击文件 - 保存时,它会将所有输入保存到一个文件中。当我作为用户打开该保存的文件时,它会将所有内容加载回其位置,我可以更改和操作输入并再次保存。我原以为这将是 adobe 或任何其他软件会教的第一件事,因为这就是软件程序的全部内容。但是很可惜,关于 adobe air for Desktop 应用程序的这个主题的教程非常少见。

我的承诺是,如果有人可以帮我解决这个问题,或者那里有一个正确涵盖这个的教程,我会在我一步一步地为其他新手写一个关于这个的教程。

4

1 回答 1

1

我相信您面临的主要问题是从 UI 输入到 XML 数据(以及返回)的转换。这更像是一个架构问题,而不是纯粹的技术问题,这可以解释为什么您很难找到信息。

演示模型

有很多方法可以解决您的用例,但最重要的是您需要一个演示模型。这是与特定视图同时使用的模型类。您可以在各种表示模型和真实数据模型(在这种特殊情况下表示为 XML 数据结构)之间来回转换。这有点抽象,但我会大致尝试与您交谈。请意识到我要向您展示的只是众多可能的方法之一。我相信这是传达这个想法的最简单的方法。

下午班

首先,我们需要为每个视图创建一个表示模型,即 1. 角色、2. 世界、3. 对象、4. 编辑器。我们将为它们命名,以便我们知道这些是模型并将它们放在自己的包中;例如

  • my.app.pm.CharactersModel
  • my.app.pm.WorldsModel
  • my.app.pm.ObjectsModel
  • my.app.pm.EditorModel

(“pm”在这里表示演示模型)
然后这些类中的每一个都会接收与您的视图中的输入和/或显示相匹配的属性。这些可以简单也可以复杂。例如,假设 'characters' 视图有一个 'title' 文本输入和一个可选字符列表,你会得到一个像这样的类:

public class CharactersModel {
    [Bindable] public var title:String;
    [Bindable] public var characters:IList; //list of Character model instances
    [Bindable] public var selectedCharacter:Character;
}

并且该 IList 中的每个字符都是以下实例:

public class Character {
    [Bindable] public var firstname:String;
    [Bindable] public var lastname:String;
}

请注意这些属性是如何标记为 Bindable 的:我们将在下一段中了解原因。

查看课程

您现在可以创建一个看起来像这样的视图类:

<fx:declarations>
    <pm:CharactersModel id="pm" />
</fx:declarations>

<s:FormItem label="Title">
    <s:TextInput text="@{pm.title}" />
</s:FormItem>

<s:FormItem label="Edit character">
    <s:DropdownList dataProvider="{pm.characters}" 
                    selectedItem="@{pm.selectedCharacter}" />
</s:FormItem>

<s:FormItem label="First name">
    <s:TextInput text="@{pm.selectedCharacter.firstName}" />
</s:FormItem>

<s:FormItem label="Last name">
    <s:TextInput text="@{pm.selectedCharacter.lastName}" />
</s:FormItem>

(警告:这是伪代码;我是在头脑中写的)
看看我们如何使用双向绑定来读取和写入 UI 的值到 Presentation Model 中?

转换

现在剩下要做的就是编写一个类,它将您的 PM 转换为您的 XML 数据结构,反之亦然。这是一个技术问题,所以我相信您可以找到有关此的信息,但基本上

当用户点击“保存”按钮时,您应该可以调用类似

var xmlToSave:XML = Convertor.pmToXml(
    charactersView.pm, worldsView.pm, objectsView.pm, editorsView.pm
);

当用户点击“加载”按钮时:

charactersView.pm = Convertor.xmlToCharactersPm(loadedXML);
worldsView.pm     = Convertor.xmlToWorldsPm(loadedXML);
objectsView.pm    = Convertor.xmlToObjectsPm(loadedXML);
editorView.pm     = Convertor.xmlToEditorPm(loadedXML);

写入磁盘

阅读我之前写的这个答案:
Storing/Saving XML in local assets folder in AIR

于 2012-09-01T13:41:38.993 回答