【问题标题】:MVC design in iOS View talks to Model - Swift - ProgrammaticallyiOS View 中的 MVC 设计与模型对话 - Swift - 以编程方式
【发布时间】: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是不是错了?

【问题讨论】:

    标签: swift model-view-controller uiview uipangesturerecognizer programmatically


    【解决方案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
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多