这是2个视图控制器:主视图和详细视图。在我实施MVP模式时,他们都有一个主持人。
我需要在详细视图控制器中更新数据。
我正在主视图控制器中使用此代码。
detailVC.presenter?.set(data: presenter?.data[row])
我正在从主视图控制器的演示者那里获取数据,并将其传递给detailVC的演示者。
这个设计好吗?
答案 0 :(得分:0)
如果您之前创建过DetailVC,则可以这样使用。您也可以使用委托模式。 MasterVC必须具有DetailVC的委托。每当需要设置数据时,都可以在MasterVC类中使用proxy.set(data:presenter?.data [row])。但是不要忘记设置MasterVC委托。
但是,如果您要创建DetailVC并设置参数,则可以使用init方法。使用所需的参数为您的detailVC创建一个初始化函数。将该函数写入到DetailVC类中,或者为您的自定义初始化函数创建一个具有不同参数的DetailViewControllerInit类。
static func initDetailVC(data: DataType?) -> UIViewController {
let vc = UIStoryboard.... // create DetailVC here..
let presenter = viewController.presenter
presenter.set(data) // or presenter.data = data
return vc
}
之后,您可以像这样在MasterVC中创建DetailVC
let detailVC = DetailVC.initDetailVC(data: presenter.data[row])
答案 1 :(得分:0)
尽管您的实现肯定会起作用,但是为了改善它,有几点需要考虑:
1)它取决于主视图控制器,它了解许多不同的内容(详细视图控制器,演示者和演示者的API)。这会创建耦合,从而使以后重构代码变得更加困难。除了考虑调用detailVC.presenter?.someMethod()
之外,我还考虑在detailVC中添加一个传递方法来处理对presenter方法的调用(以及它同时需要执行的其他任何操作),以便使您的体系结构更加模块化并且以后换出组件会更容易。
2)我将考虑将视图和模型分离。由于MVP实际上是M <-> P <-> V,因此理想情况下,您的模型和视图之间不会真正进行通信或彼此了解。在这里,当您调用detailVC.presenter?.set(data: presenter?.data[row])
时,似乎视图或至少这行代码所在的对象知道了模型。为了进行这种分离,您可以仅使视图发送事件/消息来提示演示者执行其操作,而不是直接操作数据。例如:detailVC.presenter?.newInputReceived(input: "hey!")
希望有帮助!