我应该以MVP模式将我的视图投射到iOS上的演示者中的UIViewController吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我应该以MVP模式将我的视图投射到iOS上的演示者中的UIViewController吗?相关的知识,希望对你有一定的参考价值。

在MVP结构化ios应用程序中,我经常需要在Presenter中的UIViewController类中调用一些函数。

例如,触发UI事件并且我的演示者已完成一些业务逻辑并决定执行以下一个或一些UI更新

  • 隐藏后退按钮
  • 更新导航栏标题
  • 弹出一个UIAlertController

执行以下操作会更容易和更整洁

func didClickAButton() {
    //Some business logic
    let vc = mUI as! UIViewController
    vc.navigationItem.hidesBackButton = true
    vc.title = "New Title"
    let alert = UIAlertController(title: "", message: "", preferredStyle: .alert)
    vc.present(alert, animated: true, completion: nil)
}

比为我可能需要的UIViewController类的每个函数创建协议函数。

我的问题是处理这个问题的好方法。

编辑:也许我不清楚我的问题,所以下面的代码应该更好地解释它

protocol ViewProtocol {
    func hideBackButton()
    //Potientially one protocol function for each UIViewController's
    //function I might need
    }

class Presenter {
    weak var mUI: ViewProtocol

    func updateUIAfterSomeLogic() {
        //At this point, I can do
        mUI.hideBackButton()
        //or cast mUI to UIViewController because I know it will always 
        //be a subclass of UIViewController
        let vc = mUI as! UIViewController
        vc.navigationItem.hidesBackButton = true
    }
}

class View: UIViewController, ViewProtocol {
    func hideBackButton() {
        self.navigationItem.hidesBackButton = true
    }
}
答案

您应该发送UIViewController消息的唯一对象是一个UIViewController对象。如果你有一些其他类型的对象,如Presenter实现UIViewController的某些方法,但不是视图控制器,那么你不应该将它转换为UIViewController

如果你的mUI对象是UIViewController的子类,那么它已经是UIViewController并且没有理由将它转换为该类型。

所以不,你发布的代码似乎没用,如果你的mUI对象不是UIViewController的子类,那么它不仅无益,这是一个坏主意。

编辑:

如果mUI始终是ViewController,请将其设置为符合您的协议的ViewController:

var mUI: UIViewController & ViewProtocol

以上是关于我应该以MVP模式将我的视图投射到iOS上的演示者中的UIViewController吗?的主要内容,如果未能解决你的问题,请参考以下文章

android MVP - 我可以有多个演示者用于自定义视图和片段

从单元测试的角度来看:视图应该指定演示者还是 GWT MVP 中的其他方式?

在 MVP 模式中,适配器应该持有模型还是演示者应该持有模型并让适配器引用它?

多个 MVP 演示者:如何沟通和共享信息?

WinForms 中的模型视图演示者

编程模式:MVC vs MVP