Всем привет.
Есть у меня на view в сториборде одно текстовое поле и одна кнопка. Я хочу чтобы эта кнопка добавляла текстовые поля на view по одному на каждое нажатие.
То есть например хочу я создать тестовый вопрос с вариантами ответов. Я создаю вопрос и потом хочу добавлять к нему от 2 до “много” вариантов ответов. Ввожу первый ответ в первый textfield, жму на “add”, появляется второе поле, третье и так далее.
Видел предложение создать заранее много текстовых полей со свойством hidden и по кнопке доставать их из сумрака.
Но мне хочется найти способ, который делает это иначе. То есть создает текстовое поле.
Буду рад подсказкам.
Добавление textField по нажатию кнопки
Используй таблицу, по нажатию на add просто увеличивай количество ячеек и все (соотвтсновено увеличиться количество филдов)
Просто сталкивался с этим лушче вариантов нету, можно конечно по нажатию инициализировать кнопку выставлять ей констрейны кодом + бросить скрол что бы новые элементы прокручивались вверх а не за экраном были. В таблице же все это из коробочки как говориться и скрол и констрейны все с 2мя строчка кода
Не могу я все же пока понять логику.
Создал Table View Controller в сториборде, привязал к нему файл класса TableViewController.swift, также к ячейке таблицы тоже отдельно привязал файл класса TableViewCell.swift
Содержимое файлов прилагаю.
Не могу понять как при нажатии на кнопку добавить новую строку в таблицу. По идее нужно просто в массив nameOfRow через append добавить новый элемент и обновить таблицу через reloadData()
Но как это сделать - не понимаю.
Массив в моем случае является свойством другого класса, а функция reloadData() - метод другого класса. Как до них достучаться из TableViewCell?
Подскажите плз.
И еще.
- Правильно ли создавать для ячейки отдельный файл с классом, или это излишество?
- Я правильно понимаю, что мой TableViewController в сториборде является объектом класса TableViewController? И если да, то у него(объекта) ведь должно быть какое-то имя.
TableViewController
import UIKit
class TableViewController: UITableViewController {
var nameOfRow: [String] = ["Row number", "Row number", "Row number"]
override func viewDidLoad() { super.viewDidLoad() }
override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }
override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return nameOfRow.count }
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.cellTextLabel.text = nameOfRow[indexPath.row] + " \(indexPath.row + 1)"
return cell }
}
TableViewCell
import UIKit
class TableViewCell: UITableViewCell {
@IBOutlet weak var cellTextLabel: UILabel! @IBAction func addPressed(_ sender: UIButton) { //При нажатии на кнопку добавляется еще одна ячейка } override func awakeFromNib() { super.awakeFromNib() }
override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated)
}
}
Отчасти сам разобрался со своим вопросом. Получившийся код привожу ниже. Но не разобрался, как передавать при нажатии кнопки IndexPath. Пока мне приходится вручную просто указывать
self.tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .right)
TableViewController
import UIKit
class TableViewController: UITableViewController, YourCellDelegate {
var nameOfRow: [String] = ["Row number", "Row number", "Row number"]
override func viewDidLoad() { super.viewDidLoad() }
override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }
override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return nameOfRow.count }
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell cell.cellDelegate = self
cell.cellTextLabel.text = nameOfRow[indexPath.row] + " \(indexPath.row + 1)" return cell } func didPressButton() { nameOfRow.append("New row number") self.tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .right) }
}
TableViewCell
import UIKit
protocol YourCellDelegate {
func didPressButton()
}
class TableViewCell: UITableViewCell {
var cellDelegate: YourCellDelegate? @IBOutlet weak var cellTextLabel: UILabel! @IBAction func addPressed(_ sender: UIButton) { cellDelegate?.didPressButton() } override func awakeFromNib() { super.awakeFromNib() }
override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) }
}
Буду рад подсказкам.