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



在MVP结构化的iOS应用程序中,我经常需要在演示器中调用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 的对象。如果您有一些其他类型的对象,例如实现某些UIViewController方法但不是视图控制器的演示器,则不应将其转换为UIViewController

如果mUI对象是UIViewController的子类,则它已经是一个UIViewController没有理由将其强制转换为该类型。

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

编辑:

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

var mUI: UIViewController & ViewProtocol

相关内容

  • 没有找到相关文章

最新更新