Немного застрял с паттерном MVC на Swift - PullRequest
0 голосов
/ 02 июля 2019

Так что я действительно пытаюсь понять MVC.Я перенес свое приложение в архитектуру MVC (ish), но я все еще знаю, что допустил некоторые ошибки.Самая запутанная часть для меня - связь между представлением и частью контроллера.Я определил все свои выходы, действия (текстовые поля, представления изображений, действия кнопок) в своем классе контроллера (UIViewController) и все начальные вещи, такие как ширина свойств, высота - в моем представлении.Сегодня я видел сообщение с MVC и M-VC (Massive View Controller).Теперь я в замешательстве.

То, что я хочу, это один пример моего кода.Куда я должен переместить розетки и другие вещи, и как мне установить связь между моим представлением и контроллером.

Вот мой вид для экрана:

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, но это мне совсем не помогло.Спасибо ...

1 Ответ

0 голосов
/ 02 июля 2019

Я настоятельно рекомендую вам использовать MVVM для вашего шаблона проектирования приложений.В Интернете есть много информации об этом. Образец ниже .С другой стороны, я не могу рекомендовать вам использовать Viper, потому что об этом шаблоне дизайна в Интернете не так много подробной информации.В дополнение к этому, Viper - хорошая архитектура для огромных проектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...