我是否应该以MVP模式将视图投射到iOS演示器中的UIViewController中?

时间:2018-08-24 01:15:40

标签: ios swift mobile mvp

在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
    }
}

1 个答案:

答案 0 :(得分:0)

您应该向其发送UIViewController消息的唯一对象是 UIViewController的对象。如果您有其他类型的对象(例如Presenter)来实现UIViewController的某些方法,但又不是视图控制器,则不应将其强制转换为UIViewController

如果您的mUI对象是UIViewController的子类,那么它已经一个UIViewController,因此没有理由将其转换为该类型。

因此,不,您发布的代码似乎没有用,并且如果您的mUI对象不是UIViewController的子类,那么它就无济于事,这是个坏主意。

编辑:

如果mUI始终是ViewController,则使其成为符合您的协议的ViewController:

var mUI: UIViewController & ViewProtocol