iOS 视图中的 MVC 设计与模型对话 - Swift - 以编程方式
MVC design in iOS View talks to Model - Swift - Programmatically
我对 iOS 应用程序中的 MVC 设计有疑问。
假设我用这个手势识别器设置了一个 UIView
class:
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这个代码设计实现是不是错了?
是的,它打破了 MVC 模式。只有控制器应该与模型对话。
您的控制器可以充当 CardView
.
的 delegate
这就是解决问题的方法。
protocol CardViewDelegate: class {
func cardViewShouldSendDataToDatabase(_ cardView: CardView)
}
class CardView: UIView{
weak var delegate: CardViewDelegate?
// ...
func sendDataToDatabase() {
delegate?.cardViewShouldSendDataToDatabase(self)
}
}
然后你只需要让你的 Controller 符合 CardViewDelegate
协议并实现 cardViewShouldSendDataToDatabase
你将在其中与模型对话。
我对 iOS 应用程序中的 MVC 设计有疑问。
假设我用这个手势识别器设置了一个 UIView
class:
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这个代码设计实现是不是错了?
是的,它打破了 MVC 模式。只有控制器应该与模型对话。
您的控制器可以充当 CardView
.
delegate
这就是解决问题的方法。
protocol CardViewDelegate: class {
func cardViewShouldSendDataToDatabase(_ cardView: CardView)
}
class CardView: UIView{
weak var delegate: CardViewDelegate?
// ...
func sendDataToDatabase() {
delegate?.cardViewShouldSendDataToDatabase(self)
}
}
然后你只需要让你的 Controller 符合 CardViewDelegate
协议并实现 cardViewShouldSendDataToDatabase
你将在其中与模型对话。