#ios #swift #uiviewcontroller #xib
#iOS #swift #uiviewcontroller #xib
Вопрос:
Я не являюсь ни разработчиком iOS, ни разработчиком swift, но, пожалуйста, потерпите меня:
В настоящее время я пытаюсь реализовать простое приложение для iOS, но мне трудно понять, как именно я должен настраивать пользовательские UIViews и ViewControllers для этих UIViews.
Я использую UIScrollView, который содержит элементы, немного более сложные, чем просто изображения, для чего я использую пользовательские представления. То, что я сделал, было:
- Я создал файл .xib, сам вид. Я добавил некоторые элементы (здесь это всего лишь текстовое поле, для простоты).
- Я создал класс cocoa touch «CustomView», который наследуется от UIView, и настроил свое представление на этот класс (внутри класса я просто настраиваю элементы и тому подобное).
Теперь мне нужен 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
}
}
Очевидно, что это непроверенный код, но он основан на коде продукта. Это должно быть оболочкой, которая поможет вам начать работу.