使用MVP,如何从与同一模型对象链接的另一个视图创建视图
Using MVP, how to create a view from another view, linked with the same model object
背景
我们在应用程序中使用模型视图演示器设计模式以及抽象工厂模式和"信号/插槽"模式,以满足的2个主要要求
- 增强可测试性(非常轻量级的GUI,每个操作都可以在单元测试中模拟)
- 使"视图"与其他视图完全独立,这样我们就可以在不更改任何其他内容的情况下更改实际的视图实现
为了做到这一点,我们的代码分为4层:
- 核心:持有模型
- Presenter:管理视图接口(见下文)和核心之间的交互
- 视图接口:它们定义视图的信号和插槽,但不定义实现
- 意见:意见的实际执行情况
当演示者创建或处理视图时,它使用一个抽象工厂,并且只知道视图接口。
它在视图接口之间进行信号/插槽绑定。它并不关心实际的实现。在"视图"层中,我们有一个处理实现的具体工厂。
信号/插槽机制使用基于boost::函数的自定义框架来实现。
真的,我们有这样的东西:http://martinfowler.com/eaaDev/PassiveScreen.html
一切都很好。
问题
然而,有一个问题我不知道该怎么解决。
让我们举一个非常简单的拖放示例。
我有两个ContainerViews(ContainerView1,ContainerView2)。ContainerView1有一个ItemView1。我将ItemView1从ContainerView1拖动到ContainerView2。
ContainerView2必须创建一个不同类型的ItemView2,但它"指向"与ItemView1相同的模型对象。
因此ContainerView2会得到一个回调,该回调用于使用ItemView1作为参数的drop操作。它调用ContainerPresenterB并将其传递给ItemViewB
在这种情况下,我们只处理观点。在MVP-PV中,视图不应该知道演示者或模型的任何信息,对吧?
在不知道ItemView1代表哪个模型对象的情况下,如何从ItemView1创建ItemView2?
我想给每个视图添加一个"itemId",这个id是视图所代表的核心对象的id。
所以在伪代码中,ContainerPresenter2会做一些类似的事情
itemView2=abstractWidgetFactory.createItemView2();
this.add(itemView2,itemView1.getCoreObjectId())
我不太了解细节。这很管用。我在这里遇到的问题是,那些itemId就像指针一样。指针可能是悬空的。想象一下,我错误地删除了itemView1,这样就删除了coreObject1。itemView2将具有表示无效coreObject的coreObjectId。
难道没有更优雅、更"防弹"的解决方案吗?
尽管我从未做过ObjectiveC或macOSX编程,但我还是忍不住注意到我们的框架与Cocoa框架非常相似。他们是如何处理这类问题的?在谷歌上找不到更深入的信息。如果有人能对此有所了解的话。
我希望这个问题不要太令人困惑。。。
好的,我发现的技术实际上来自Cocoa,所以它是objective-C,但你肯定可以在C++中做同样的事情。
解决方案就是简单地使用PasteBoard(developer.apple.com文档)。
希望它能帮助别人。。。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 你能重载对象变量名本身返回的内容吗
- 从函数返回范围视图时,带有std::span:中间对象所有权的C++Ranges-v3
- C :对象上的可复制视图
- 如何通过文件映射对象重新映射共享内存的视图?
- Visual Studio中智能指针对象的自定义视图
- 食人魔:模拟透视视图缩放对象
- 如何计算摄影机对象的视图矩阵
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- 在OpenGL中将视图更改为对象
- VTK ActiViz将对象重置为原始视图
- iOS 如何将C++对象存储到用作表视图数据源的 NSArray 中
- 为自定义对象列表使用哪个模型子类/视图
- 关于如何切换代表视图的CChildView对象
- 使用MVP,如何从与同一模型对象链接的另一个视图创建视图