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 你将在其中与模型对话。