Настройка ViewController для представления .xib

#ios #swift #uiviewcontroller #xib

#iOS #swift #uiviewcontroller #xib

Вопрос:

Я не являюсь ни разработчиком iOS, ни разработчиком swift, но, пожалуйста, потерпите меня:

В настоящее время я пытаюсь реализовать простое приложение для iOS, но мне трудно понять, как именно я должен настраивать пользовательские UIViews и ViewControllers для этих UIViews.

Я использую UIScrollView, который содержит элементы, немного более сложные, чем просто изображения, для чего я использую пользовательские представления. То, что я сделал, было:

  • Я создал файл .xib, сам вид. Я добавил некоторые элементы (здесь это всего лишь текстовое поле, для простоты).
  • Я создал класс cocoa touch «CustomView», который наследуется от UIView, и настроил свое представление на этот класс (внутри класса я просто настраиваю элементы и тому подобное).

создал представление и соответствующий класс quot;CustomViewquot;

теперь представление имеет тип quot;CustomViewquot;

Теперь мне нужен ViewController, который управляет классом всякий раз, когда он отображается (например, реагирует на изменение textField ). Я не могу управлять всем из своего основного ViewController, потому что он станет слишком большим (например, 3 просмотра прокрутки * 5 вложенных представлений, которыми необходимо управлять). Мне нужно решение, которое использует ViewControllers для каждого подвида (на случай, если у них самих тоже будут подвиды).

Как мне это сделать?

Нужно ли мне добавлять какой-то childViewController?

Я действительно в растерянности, большинство сообщений в блогах и примеров SO просто не работают и / или устарели, и я не уверен, правильно ли я понял весь шаблон View — ViewController.

Комментарии:

1. Насколько я понимаю, вы хотите вставить много viewcontrollers с scrollview внутри в другой scrollview, я прав?

2. Я попытался сделать вопрос как можно более общим, но это, например, очень похоже на то, что я пытаюсь сделать. На самом деле, у меня есть ScrollView с элементами в нем, которые немного сложнее, и для этого нужны какие-то отдельные контроллеры. У меня есть Scrollview, содержащий элементы, которые управляют scrollviews, которые поддерживают пользовательский вид. Дело не только в том, что я не знаю, как справиться с моей конкретной проблемой, я просто слишком мало знаю о MVC и swift, чтобы придумать общий, применимый шаблон для этих ситуаций.

3. supereasyapps.com/blog/2014/12/15/… Проверьте эту ссылку, она может быть вам полезна

4. Спасибо за ссылку, похоже, это отличный ресурс, но он не создает ViewController для своего пользовательского представления. Я видел, как люди помещали методы в свои CustomView классы, которые реагировали на события, но, по моему мнению, это недопустимый MVC, поскольку представление также управляет (модели не должны ничего знать о представлениях и наоборот). Как я уже сказал, ни один из ресурсов, которые я нашел в Интернете, не помог мне, но, возможно, я пытаюсь реализовать то, что я не должен пытаться реализовать…

Ответ №1:

Допустим, у вас есть два контроллера представления, MainViewController и TableViewController . Основной вид tableVC должен быть подвидом основного вида mainVC. Кроме того, вы хотите передать обратно в mainVC, какая ячейка была выбрана в tableVC.

Решение состоит в том, чтобы (а) сделать tableVC дочерним для mainVC и (б) сделать mainVC делегатом для tableVC.

TableViewController:

 protocol TableVCDelegate {
    func cellSelected(sender: TableViewController)
}

class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // please note that you can do delegation differently,
    // this way results in crashes if delegate is nil!

    var delegate:TableVCDelegate! = nil
    var someValue = ""

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // set someValue to contents in the selected cell or it's data source

        someValue = "Hello World!"
        delegate.cellSelected(sender: self)

    }
}
  

MainViewController:

 class MainViewController: UIViewController, TableVCDelegate {

    let tableVC = TableViewController()

    override func viewDidLoad() {

        // make tableVC be a child of this VC

        addChild(tableVC)
        tableVC.didMove(toParent: self)
        tableVC.delegate = self

        // position tableVC.view

        tableVC.view.translatesAutoresizingMaskIntoConstraints = false

    }

    func cellSelected(sender: TableViewController) {
        print(sender.someValue)  // this should send "Hello World!" to the console
    }
}
  

Очевидно, что это непроверенный код, но он основан на коде продукта. Это должно быть оболочкой, которая поможет вам начать работу.