MVP:视图控制器可以向其他视图控制器的演示者发送消息吗?

时间:2019-08-19 13:11:47

标签: ios swift mvp

这是2个视图控制器:主视图和详细视图。在我实施MVP模式时,他们都有一个主持人。

我需要在详细视图控制器中更新数据。

我正在主视图控制器中使用此代码。

detailVC.presenter?.set(data: presenter?.data[row])

我正在从主视图控制器的演示者那里获取数据,并将其传递给detailVC的演示者。

这个设计好吗?

2 个答案:

答案 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!")

希望有帮助!