Как указано в этот ответ :
- каждый раз, когда табличное представление запрашивает ячейку, создается новое текстовое поле / текстовое представление
- цикл по widgetInStockArray при создании ячейки приведет к добавлению нескольких текстовых полей и текстовых представлений в эту ячейку
Пример кода из вопроса может быть изменен и улучшен следующим образом для достижения желаемого результата.
Информация о реструктуризации
Определите два типа для более удобного доступа к идентификатору, метке и виджету одного элемента товара.
enum StockWidget: String {
case textField
case textView
}
struct StockItem {
let id: IntegerLiteralType
let label: String
let widget: StockWidget
}
Обновите данные образца соответствующим образом.
let stockArray: [StockItem] = [
StockItem(id: 1, label: "1ok", widget: .textView),
StockItem(id: 2, label: "2ok", widget: .textField),
StockItem(id: 3, label: "3ok", widget: .textView),
StockItem(id: 4, label: "4ok", widget: .textField),
StockItem(id: 5, label: "5ok", widget: .textField),
StockItem(id: 6, label: "6ok", widget: .textView),
StockItem(id: 7, label: "7ok", widget: .textField)
]
Определить конкретные ячейки
Один с UITextField
:
class TextFieldWidgetCell: UITableViewCell {
let textField: UITextField
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
let field = UITextField(frame: CGRect(x: 10, y: 10, width: 200, height: 30))
field.layer.borderColor = UIColor.gray.cgColor
field.layer.borderWidth = 1.0
field.layer.cornerRadius = 3.0
field.textColor = UIColor.gray
textField = field
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(textField)
}
override func prepareForReuse() {
super.prepareForReuse()
textField.placeholder = nil
textField.text = nil
}
}
и один с UITextView
:
class TextViewWidgetCell: UITableViewCell {
let textView: UITextView
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
let view = UITextView(frame: CGRect(x:10, y: 10, width: 200, height: 60))
view.backgroundColor = UIColor.white
view.font = UIFont.systemFont(ofSize: 15)
view.layer.borderColor = UIColor.gray.cgColor
view.layer.borderWidth = 1.0
view.layer.cornerRadius = 3.0
view.textAlignment = NSTextAlignment.justified
view.textColor = UIColor.black
textView = view
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(textView)
}
override func prepareForReuse() {
super.prepareForReuse()
textView.text = nil
}
}
Зарегистрируйте ячейки виджета в табличном представлении.
override func viewDidLoad() {
super.viewDidLoad()
firstTableView.dataSource = self
firstTableView.delegate = self
firstTableView.register(TextFieldWidgetCell.self, forCellReuseIdentifier: StockWidget.textField.rawValue)
firstTableView.register(TextViewWidgetCell.self, forCellReuseIdentifier: StockWidget.textView.rawValue)
}
Адаптировать UITableViewDataSource
Реализация
Теперь, когда конфигурация ячейки разделена на два UITableViewCell
подкласса, реализация tableView(_, cellForRowAt:)
может быть значительно уменьшена.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return stockArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let stockItem = stockArray[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: stockItem.widget.rawValue)
switch stockItem.widget {
case .textField:
if let cell = cell as TextFieldWidgetCell {
cell.textField.placeholder = stockItem.label
}
case .textView:
if let cell = cell as TextViewWidgetCell {
cell.textView.text = stockItem.label
}
}
return cell
}