Должна ли быть определена логика целевого метода кнопки в UIView или UIViewController - PullRequest
0 голосов
/ 21 октября 2019

У меня есть кнопка и текстовое представление, определенные в классе UIView. Который будет делать запрос сети при нажатии. Должен ли я добавить button.addTarget в UIView или UIViewController. что такое MVC способ сделать это.

class MessageInputView: UIView {

    let send_button: UIButton = {
        let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = .red
        button.setTitle("Send", for: .normal)
        button.setTitleColor(UIColor.black, for: .normal)
        return button
    }()

    let textView: UITextView = {
        let textView = UITextView()
        textView.translatesAutoresizingMaskIntoConstraints=false
        textView.clipsToBounds = true
        textView.layer.cornerRadius = 19.5
        textView.layer.borderWidth = 1
        textView.layer.borderColor = UIColor.inputTextViewColor.cgColor
        return textView
    }()
}


class ChatMessagesViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    let messageInputView = MessageInputView()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        messageInputView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(messageInputView)
        setMessagesInputViewConstraints()
    }

}

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Если у вас есть собственный класс для вашего элемента представления, вы должны объявить IBAction в этом классе, но логика должна происходить в контроллере представления (или другом ответственном классе в других архитектурах).

Вы можете установить связь между представлением и контроллером представления через шаблон делегата или с помощью замыканий, в зависимости от того, что лучше соответствует вашему коду.

Вот пример замыкания:

class CustomView: UIView {
  // ...
  var buttonHandler: (() -> Void)?

  @IBAction func buttonAction(_ sender: UIButton) {
    buttonHandler?()
  }
  // ...
}

class ViewController: UIViewController {
  // ...
  override func viewDidLoad() {
    // ...
    customView.buttonHander = { print("User clicked the button") }
  }
}
0 голосов
/ 21 октября 2019

Давайте посмотрим на разницу между моделью, представлением и контроллером.

  1. представление - это способ взаимодействия пользователя с приложением. Он должен только касаться получения входных данных от пользователя и отправки выходных данных пользователю. Любые другие операции должны быть делегированы чему-то, что не является представлением.
  2. Модель - это то, как приложение обрабатывает необходимые операции. Он не должен знать или заботиться о том, как / где используется результат этих операций. Он просто выполняет запрошенное действие и возвращает результат запрашивающей стороне.
  3. Контроллер - это то, что устанавливает пути / адаптеры связи между представлением и моделью. Это единственная сущность, которая знает, что существует представление и модель;они не должны знать о существовании друг друга или контролера, так как им не нужно заботиться об этом. Все, что им нужно, это адаптер, который позволяет им взаимодействовать с какой-либо внешней сущностью, которую предоставляет контроллер.

Учитывая эту информацию, для меня имеет смысл, что при нажатии вашей кнопки должен быть сделан запроск вещам, которые обрабатывают его запросы через свой адаптер. Этот адаптер направляет запрос в модель, которая выполняет операцию и возвращает результат. Таким образом, представление ничего не знает о том, куда направляется его запрос или откуда поступает ответ, и модель не имеет представления о том, что представление является тем, которое запрашивает действие и ответ. Это сохраняет инкапсуляцию.

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