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 模式。只有控制器应该与模型对话。 您的控制器可以充当delegateCardView

这就是你可以解决它的方法。

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 - 以编程方式的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发之理解iOS中的MVC设计模式

iOS开发设计模式之MVC

ios 设计模式简述

MVC 设计模式。 View如何适应它?

iOS 浅谈MVC设计模式及Controllers之间的传值方式

从 View 与 ViewController 对话