哪个是在MVP模式中初始化演示者的最佳方式(swift)

时间:2017-04-15 12:28:35

标签: ios swift xcode mvp

通常,我将此函数编写为从viewController初始化我的演示者。但是我想使用 init()来实现这个目标。我该怎么办?

ViewController:

class ViewController: UIViewController {
  private let viewPresenter = viewPresenter()

  override func viewDidLoad() {
    self.viewPresenter.attachView(controller: self)
  }

  @IBAction func faceBookButtonTapped(sender: UIButton) {
    self.viewPresenter.showLoginWindow()
  }
}

ViewPresenter:

class ViewPresenter {
  var controller: ViewController?

  func attachView(controller: ViewController) {
    self.controller = controller
  }
}

所以,如果我在演示者中制作这个Init:

let controller: ViewController?
init (controller:ViewController) {
    self.controller = controller
}

并在viewController中尝试初始化:

private let viewPresenter = ViewPresenter(controller: self)

Xcode给我这个错误: 无法转换类型的值'(NSObject) - > () - > ViewController'到期望的参数类型'ViewController'

1 个答案:

答案 0 :(得分:2)

问题在于没有" self"在那个时候你想要初始化你的演示者,因为你的视图控制器稍后被初始化。你可以通过声明你的演示者像这样懒惰来解决这个问题

fileprivate lazy var viewPresenter: ViewPresenter = {
    return ViewPresenter(controller: self)
}()

或者您可以稍后在viewDidLoad

中初始化您的演示者
private var viewPresenter: ViewPresenter!

override func viewDidLoad() {
    super.viewDidLoad()

    self.viewPresenter = ViewPresenter(controller: self)
}

如果您问我最好的方法是(正如您已经做的那样)将viewDidLoad中的视图附加到演示者。

希望这有帮助。