iOS视图中的MVC设计以编程方式与Model-Swift对话

iOS视图中的MVC设计以编程方式与Model-Swift对话,swift,model-view-controller,uiview,uipangesturerecognizer,programmatically,Swift,Model View Controller,Uiview,Uipangesturerecognizer,Programmatically,我有一个关于iOS应用程序中MVC设计的问题 假设我使用此手势识别器设置了一个UIView类: class CardView:UIView{ init(帧:CGRect){ 让panGesture=UIPangESTURE识别器(目标:自我,动作:#选择器(手势:)) self.addgesture识别器(panGesture!) } @objc func handlePan(手势:UIPangestureRecognitor){ 开关状态{ 案例.开始: 把手(手势) 案例。更改: 手变了(手

我有一个关于iOS应用程序中MVC设计的问题

假设我使用此手势识别器设置了一个
UIView
类:

class CardView:UIView{
init(帧:CGRect){
让panGesture=UIPangESTURE识别器(目标:自我,动作:#选择器(手势:))
self.addgesture识别器(panGesture!)
}
@objc func handlePan(手势:UIPangestureRecognitor){
开关状态{
案例.开始:
把手(手势)
案例。更改:
手变了(手势)
案件结束:
手舞足蹈(手势)
sendDataToDatabase()
案件.已取消:
turnCardBackToOrigin()
违约:
打破
}
}
}
正如您所看到的,视图手势的目标是视图本身。 现在假设在switch
case.end中,我想向数据库发送数据


既然我让视图(CardView)与模型(数据)对话,这会打破MVC设计规则吗?根据MVC,这种代码设计实现是错误的吗?

是的,它打破了MVC模式。只有控制器才能与模型对话。 您的控制器可以充当
卡视图的
代表

这就是你可以修复它的方法

protocol CardViewDelegate: class {
    func cardViewShouldSendDataToDatabase(_ cardView: CardView)
}

class CardView: UIView{
    weak var delegate: CardViewDelegate?
    
    // ...
    
    func sendDataToDatabase() {
        delegate?.cardViewShouldSendDataToDatabase(self)
    }
}

然后,您只需使控制器符合
CardViewDelegate
协议,并实现
cardViewShouldSendDataToDatabase
,在其中您将与模型对话。

此外,我认为该过程中缺少的一个步骤是在controllerI中创建视图时,将视图
委派设置为控制器我也不同意这一点
cardViewShouldSendDataToDatabase
?卡片视图甚至不应该知道有一个数据库。可以说,视图控制器甚至不应该知道。你会怎么做@matt?你可以根据自己的意愿命名你的委托方法;)我同意matt的观点,你应该根据方法的功能来命名方法。例如,如果要在平移手势结束时关闭视图,则应将其命名为
cardwiewwilldisease