在此步骤中,我们将显示在屏幕之间切换时如何保存数据以及如何检索保存的数据。

在模型中保存数据

为了将在视图(即屏幕)中操作的数据持久化,应将数据(通过演示者)发送到模型。有关Model-View-Presenter模式的更多信息,可以在Internet上的许多地方找到,例如在Wikipedia上,或者在  “屏幕概念和Model-View-Presenter”一文中

将小时和分钟添加到模型

该模型负责保存应用程序的数据。临时数据(例如按钮状态,当前可见的小部件等)不应在模型中。

要通过模型保存和检索数据,请向模型添加受保护的小时和分钟值,以及用于访问这些值的公共函数:

	
	

型号

... public: void saveHour(int16_t saveHour) { hour = saveHour; } void saveMinute(int16_t saveMinute) { minute = saveMinute; } int16_t getHour() { return hour; } int16_t getMinute() { return minute; } protected: int16_t hour; int16_t minute; ...

确保在构造函数中初始化小时和分钟:

	
	

模型.cpp

... Model::Model() : modelListener(0), hour(0), minute(0) { } ...

使用此代码,小时和分钟在模型中占有一席之地。由于该模型可供所有演示者使用,因此这是在演示者(和视图)之间共享信息的推荐方法。该模型也是UI能够连接到系统其余部分(例如硬件外围设备和其他软件模块)的地方。

 

从视图访问模型

现在,为了从视图访问模型中的数据,演示者应该提供允许Screen1View从模型中加载和保存数据的函数,如下所示:

	
	

Screen1Presenter.hpp

... public: void saveHour(int16_t hour) { model->saveHour(hour); } void saveMinute(int16_t minute) { model->saveMinute(minute); } int16_t getHour() { return model->getHour(); } int16_t getMinute() { return model->getMinute(); } ...

由于Screen2还应该能够访问模型中的数据,因此将相同的行添加到Screen2Presenter.hpp。

来自模型的数据

现在已经可以访问模型中的小时和分钟代码,并且应更新Screen1和Screen2以从Model中获取这些值,而不是仅使用局部变量。

更新画面1

现在,我们可以使用模型中的值在Screen1View中初始化小时和分钟,并初始化文本区域的缓冲区:

	
	

Screen1View.cpp

... void Screen1View::setupScreen() { Screen1ViewBase::setupScreen(); hour = presenter->getHour(); minute = presenter->getMinute(); Unicode::snprintf(textAreaHourBuffer, TEXTAREAHOUR_SIZE, "%02d", hour); Unicode::snprintf(textAreaMinuteBuffer, TEXTAREAMINUTE_SIZE, "%02d", minute); } ...

为了保存小时和分钟值,在Screen1View.hpp中实现了在交互下为两个保存按钮创建的虚拟函数,并将这些值存储在模型中(通过演示者):

	
	

Screen1View.hpp

... public: virtual void buttonSaveHourClicked() { presenter->saveHour(hour); } virtual void buttonSaveMinuteClicked() { presenter->saveMinute(minute); } ...

现在,Screen1从模型中获取小时和分钟的初始值。

更新Screen2

Screen2还需要将其值与模型同步。

与屏幕1相似,文本时钟中显示的初始值必须与来自模型的数据匹配。

	
	

Screen2View.cpp

... void Screen2View::setupScreen() { Screen2ViewBase::setupScreen(); hour = presenter->getHour(); minute = presenter->getMinute(); Unicode::snprintf(textClockBuffer1, TEXTCLOCKBUFFER1_SIZE, "%02d", hour); Unicode::snprintf(textClockBuffer2, TEXTCLOCKBUFFER2_SIZE, "%02d", minute); } ...

这将从模型中获取小时和分钟。当我们离开屏幕时(必须转到Screen1上的配置屏幕),必须将更新后的值发送回模型:

	
	

Screen2View.cpp

... void Screen2View::tearDownScreen() { presenter->saveHour(hour); presenter->saveMinute(minute); Screen2ViewBase::tearDownScreen(); } ...

这将在进入配置屏幕之前,将更新的小时和分钟值发送到模型。

到此为止,此小型应用程序由此结束,从而得出了教程3,但仍需进一步改进,并且可以在下一步中找到想法