iOS View 中的 MVC 设计与模型对话 - Swift - 以编程方式
Posted
技术标签:
【中文标题】iOS View 中的 MVC 设计与模型对话 - Swift - 以编程方式【英文标题】:MVC design in iOS View talks to Model - Swift - Programmatically 【发布时间】:2020-11-11 12:30:41 【问题描述】:我有一个关于 ios 应用程序中的 MVC 设计的问题。
假设我用这个手势识别器设置了一个UIView
类:
class CardView: UIView
init(frame: CGRect)
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(gesture:)))
self.addGestureRecognizer(panGesture!)
@objc func handlePan(gesture : UIPanGestureRecognizer)
switch gesture.state
case .began:
handleBegan(gesture)
case .changed:
handleChanged(gesture)
case .ended:
handleEnded(gesture)
sendDataToDatabase()
case .cancelled:
turnCardBackToOrigin()
default:
break
如您所见,视图手势的目标是视图本身。
现在假设在 switch case .ended
中我想将数据发送到数据库。
既然我要让视图(CardView)与模型(数据)对话,这会违反 MVC 设计规则吗?这个代码设计实现按照MVC是不是错了?
【问题讨论】:
【参考方案1】:是的,它打破了 MVC 模式。只有控制器应该与模型对话。
您的控制器可以充当delegate
到CardView
。
这就是你可以解决它的方法。
protocol CardViewDelegate: class
func cardViewShouldSendDataToDatabase(_ cardView: CardView)
class CardView: UIView
weak var delegate: CardViewDelegate?
// ...
func sendDataToDatabase()
delegate?.cardViewShouldSendDataToDatabase(self)
然后你只需要让你的控制器符合CardViewDelegate
协议并实现cardViewShouldSendDataToDatabase
,你将在其中与模型对话。
【讨论】:
另外,我认为该过程中缺少的一步是在控制器中创建视图时将视图delegate
设置为控制器
我也不同意这一点。 cardViewShouldSendDataToDatabase
?卡片视图甚至不应该知道是一个数据库。可以说,视图控制器甚至不应该知道。
你会怎么做@matt?
您当然可以根据自己的喜好命名您的委托方法;)
我同意 matt 的观点,你应该根据它们的作用来命名你的方法。例如,如果您要在平移手势结束时关闭视图,您应该将其命名为 cardViewWillDismiss
以上是关于iOS View 中的 MVC 设计与模型对话 - Swift - 以编程方式的主要内容,如果未能解决你的问题,请参考以下文章