在Swift上有点卡在MVC图案上



所以我真的在尝试理解MVC。我已经将应用程序迁移到MVC(ISH(架构中,但我仍然知道我犯了一些错误。对我来说,最令人困惑的部分是视图与控制器部分之间的通信。我在我的控制器(UiviewController(类中定义了所有插座,操作(文本字段,图像视图,按钮操作(,以及所有初始内容(例如属性宽度,高度(。今天,我看到了MVC和M-VC(大量视图控制器(的帖子。现在我更加困惑。

我想要的是我代码的一个示例。我应该在哪里移动插座和其他东西,以及如何在视图和控制器之间建立通信。

这是我对屏幕的看法:

class incidentMgmView: UIView, UIPickerViewDataSource {
    var textHeightConstraint: NSLayoutConstraint!
    var datePicker: UIDatePicker?
    let namePickr = UIPickerView()
    var pickerData = namePicker()
    // Auto Resizing Text Field Functions
    func autoResizeTextView(textView: UITextView){
        textView.clipsToBounds = true
        textView.layer.cornerRadius = 5
        textHeightConstraint = textView.heightAnchor.constraint(equalToConstant: 40)
        textHeightConstraint.isActive = true
        adjustTextViewHeight(txtView: textView)
    }
    func adjustTextViewHeight(txtView: UITextView) {
        let fixedWidth = txtView.frame.size.width
        let newSize = txtView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
        textHeightConstraint.constant = newSize.height
    }
    // Exit editing if a touch is registered.
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        endEditing(true)
    }
    // Date Picker View
    func datePick(dateTextField: UITextField){
        datePicker = UIDatePicker()
        datePicker?.datePickerMode = .date
        datePicker?.addTarget(incidentMgm(), action: #selector(incidentMgm.dateChanged(datePicker:)), for: .valueChanged)
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped(gestureRecognizer:)))
        addGestureRecognizer(tapGesture)
        dateTextField.inputView = datePicker
        let pickerToolBar = toolBarPicker().ToolbarPicker(mySelect: #selector(incidentMgm.dismissDatePicker))
        dateTextField.inputAccessoryView = pickerToolBar
    }
    // Exit editing if a touch is registered.
    @objc func viewTapped(gestureRecognizer: UITapGestureRecognizer){
        endEditing(true)
    }
    // Picker View
    func namePick(pickerTextField: UITextField){
        pickerTextField.inputView = namePickr
        namePickr.dataSource = self
        let toolBar = toolBarPicker().ToolbarPicker(mySelect: #selector(incidentMgm.dismissPersonPicker))
        pickerTextField.inputAccessoryView = toolBar
    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView( _ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.contentSize
    }

这是此视图的控制器:

class incidentMgm: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate,UITextFieldDelegate, UIPickerViewDelegate,UITextViewDelegate {
    // Outlets
    @IBOutlet weak var neredeTextField: UITextField!
    @IBOutlet weak var aTextField: UITextField!
    @IBOutlet weak var hangiTextField: UITextField!
    @IBOutlet weak var neTextField: UITextField!
    @IBOutlet weak var myTextView: UITextView!
    @IBOutlet weak var dateTxtField: UITextField!
    @IBOutlet weak var imageView3: UIImageView!
    @IBOutlet weak var imageView2: UIImageView!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var nameTextField: UITextField!
    //
    var views = incidentMgmView() // View Class
    let imagePicker = UIImagePickerController()
    var imagepos = 0
    var camimg = UIImage.init(named: "camicon")
    var imgArray = [UIImageView]()
    override func viewDidLoad() {
        super.viewDidLoad()
        initialize()
        views.namePick(pickerTextField: nameTextField)
        views.datePick(dateTextField: dateTxtField)
        views.autoResizeTextView(textView: myTextView)
        imgTap()
    }
    //  Assinging tags and delegates
    func initialize(){
        neTextField.delegate = self
        dateTxtField.delegate = self
        neredeTextField.delegate = self
        hangiTextField.delegate = self
        aTextField.delegate = self
        imagePicker.delegate = self
        myTextView.delegate = self
        views.namePickr.delegate = self
        //  Image stuff
        imgArray.append(imageView)
        imgArray.append(imageView2)
        imgArray.append(imageView3)
        for i in 0...2{
            imgArray[i].image = camimg
            imgArray[i].tag = i
        }
    }
    //  Image Picker Controller Functions
    func imgTap(){
        var tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
        for imgView in imgArray{
            imgView.isUserInteractionEnabled = true
            imgView.addGestureRecognizer(tapGestureRecognizer)
            tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
        }
    }
    @objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
    {
        _ = tapGestureRecognizer.view as! UIImageView
        imagePicker.sourceType = .camera
        imagePicker.allowsEditing = false
        present(imagePicker, animated: true, completion: nil)
        imagepos = tapGestureRecognizer.view!.tag
    }
    @objc func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
            for imgView in imgArray {
                if(imagepos == imgView.tag){
                    imgView.image = image
                    imagePicker.dismiss(animated: true, completion: nil)
                }
            }
        }
    }
    // Skip to the next text field with return button
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        switch textField{
        case neTextField:
            dateTxtField.becomeFirstResponder()
            break
        case dateTxtField:
            neredeTextField.becomeFirstResponder()
            break
        case neredeTextField:
            nameTextField.becomeFirstResponder()
            break
        case hangiTextField:
            myTextView.becomeFirstResponder()
            break
        case myTextView:
            aTextField.becomeFirstResponder()
            break
        default:
            textField.resignFirstResponder()
            break
        }
        return true
    }
    @objc func dismissPersonPicker(textField: UITextField){
        hangiTextField.becomeFirstResponder()
    }
    @objc func dismissDatePicker(textField: UITextField) {
        neredeTextField.becomeFirstResponder()
    }
    @objc func dateChanged(datePicker: UIDatePicker){
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd/MM/yyyy"
        dateTxtField.text = dateFormatter.string(from: datePicker.date)
    }
    internal func pickerView( _ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        nameTextField.text = views.pickerData.pickerContent[row]
    }
    func pickerView( _ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return views.pickerData.pickerContent[row]
    }
    func textViewDidChange(_ textView: UITextView) {
        views.adjustTextViewHeight(txtView: myTextView)
    }
}

这种观点的作用是将带有文本和图像的表单提交给我的服务。

,如果我有一个例子可以为我定义MVC模式,我会感到非常高兴。我尝试阅读许多论坛帖子和Apple的MVC文档,但这根本没有帮助。谢谢...

我强烈建议您为应用程序设计模式使用MVVM。在线上有大量有关它的信息。下面的样本。另一方面,我不建议您使用Viper,因为关于这种设计模式,在线上没有太多详细信息。除此之外,Viper是一个很好的架构。

最新更新