本帖最后由 eefocus_3880118 于 2024-4-22 20:27 编辑
上一篇文章我们做了两个页面的切换,但是有个小问题,当我在有slider的页面中改变了其value,然后切换页面后,再回来,slider的value又变成了默认值,不是离开页面之前的值。
这是因为TouchGFX使用的MVP结构中,M是公用的,每一个页面都有自己的V和P,这两个的内容是动态分配的,也就意味着,同一时间只能有一个V和P,当这个页面被新的页面顶替后,旧的页面就会被摧毁。这样做的好处就是可以节约RAM。
那么为了实现页面切换再切换回来还要保持原样,我们就需要做一下缓存,把slider的value缓存到M中,然后在再次切回本页面时从M中把之前保存的slider的value重新加载到页面中
先在Model.hpp中创建一个保存、获取Slider的Value参数的函数
- void saveSliderValue(int saveSliderValue)
- {
- sliderValue = saveSliderValue;
- }
- int getSliderValue()
- {
- return sliderValue;
- }
复制代码 还有用于保存数据的变量
然后初始化该参数,该参数的默认值和Slider的默认value一致,因为回头在slider的那个页面setup时会加载这个参数,为了第一次上电时slider的初始值正确,就要写90(其实在setup时增加一个flag也行,当第一次进入时不加载,第二次及以后才加载)
- Model::Model() : modelListener(0), sliderValue(90)
- {
- }
复制代码
M中的内容会被P调用,所以在Screen2Presenter.hpp也增加保存、获取Slider的Value参数的函数
- void saveSliderValue(int SliderValue)
- {
- model->saveSliderValue(SliderValue);
- }
- int getSliderValue()
- {
- return model->getSliderValue();
- }
复制代码
P会被V调用,所以在V中就要实际去做读写的操作了。在页面加载时读取参数,设置给slider。页面退出时把slider的value读取出来保存起来
- void Screen2View::setupScreen()
- {
- slider1.setValue(presenter->getSliderValue());
- Screen2ViewBase::setupScreen();
- }
- void Screen2View::tearDownScreen()
- {
- presenter->saveSliderValue(slider1.getValue());
- Screen2ViewBase::tearDownScreen();
- }
复制代码
这样就可以实现切换页面时实现数据的保存和加载,效果如下
如果你有其他的东西需要保存、加载,大致的逻辑是本文介绍的一致,不同的就是在setupScreen、tearDownScreen中对控件参数的读和写,这里有一个困难点就是对于初学者来说,有太多的API,例如我想去设置slider的value却不知道应该调用哪个函数。
有两个解决方案
1.去TouchGFX的网站看文档,里面有所有的API,慢慢的查。
2.进入到ViewBase.cpp,里面有一个Screen2ViewBase函数,这个就是我们再软件中绘制的界面,自动生成的代码,里面又会有设置slider的value的函数,照着抄就行(但是如果你想要的接口并不会在绘制界面时调用,例如读取slider的value,那就只有方法1了)
|