Добавление textField по нажатию кнопки


#1

Всем привет.
Есть у меня на view в сториборде одно текстовое поле и одна кнопка. Я хочу чтобы эта кнопка добавляла текстовые поля на view по одному на каждое нажатие.
То есть например хочу я создать тестовый вопрос с вариантами ответов. Я создаю вопрос и потом хочу добавлять к нему от 2 до “много” вариантов ответов. Ввожу первый ответ в первый textfield, жму на “add”, появляется второе поле, третье и так далее.
Видел предложение создать заранее много текстовых полей со свойством hidden и по кнопке доставать их из сумрака.
Но мне хочется найти способ, который делает это иначе. То есть создает текстовое поле.
Буду рад подсказкам.


#2

Используй таблицу, по нажатию на add просто увеличивай количество ячеек и все (соотвтсновено увеличиться количество филдов)


#3

Спасибо! Отличный вариант. Но есть ли еще какие то способы?


#4

Написать свой велосипед. Только зачем?


#5

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


#6

Не могу я все же пока понять логику.
Создал Table View Controller в сториборде, привязал к нему файл класса TableViewController.swift, также к ячейке таблицы тоже отдельно привязал файл класса TableViewCell.swift

Содержимое файлов прилагаю.
Не могу понять как при нажатии на кнопку добавить новую строку в таблицу. По идее нужно просто в массив nameOfRow через append добавить новый элемент и обновить таблицу через reloadData()

Но как это сделать - не понимаю.
Массив в моем случае является свойством другого класса, а функция reloadData() - метод другого класса. Как до них достучаться из TableViewCell?
Подскажите плз.

И еще.

  1. Правильно ли создавать для ячейки отдельный файл с классом, или это излишество?
  2. Я правильно понимаю, что мой 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)
}

}


#7

Отчасти сам разобрался со своим вопросом. Получившийся код привожу ниже. Но не разобрался, как передавать при нажатии кнопки 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)
}

}

Буду рад подсказкам.