问题描述
我想阅读表格视图中动态单元格中文本字段中的文本。
我的问题: 如何从文本字段(textField1 和 textField2)中读取值并将它们添加到我的卡片结构中?
在 Cards 结构中有两个变量。 frontLabel 和 backLabel 作为字符串
我的表视图:
class AddFCViewController: UIViewController {
var numberOfTextFields = 1
var cards = [Cards]()
// Table View
let tableView : UITableView = {
let tableView = UITableView()
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.backgroundColor = .purple
return tableView
}()
// Add Button
let addButtton : UIButton = {
let btn = UIButton()
btn.translatesAutoresizingMaskIntoConstraints = false
btn.backgroundColor = .link
btn.setTitle("Ekle",for: .normal)
return btn
}()
override func viewDidLoad() {
super.viewDidLoad()
configureTableView()
configureAddButton()
}
// MARK: - Configure Add Button
func configureAddButton() {
view.addSubview(addButtton)
addButtton.addTarget(self,action: #selector(addButtonTapped(sender:)),for: .touchUpInside)
}
// MARK: - Add Button Tapped MEthod
@objc func addButtonTapped(sender: UIButton){
numberOfTextFields += 1
tableView.reloadData()
}
// MARK: - Configure Table View
func configureTableView() {
view.addSubview(tableView)
setTableViewDelegates()
tableView.rowHeight = 100
tableView.register(AddFCCell.self,forCellReuseIdentifier: "AddFCCell")
}
// MARK: - Table View Delegates
func setTableViewDelegates() {
tableView.delegate = self
tableView.dataSource = self
}
}
// MARK: - Table View Extension & Delegate Methods
extension AddFCViewController: UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate {
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return numberOfTextFields
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "AddFCCell") as! AddFCCell
cell.selectionStyle = .none
cell.textField1.tag = indexPath.row
cell.textField2.tag = indexPath.row
print(cell.textField1.tag)
print(cell.textField2.tag)
// cell.textField1.text = cards[indexPath.row].frontLabel
// cell.textField2.text = cards[indexPath.row].backLabel
cell.textField1.delegate = self
cell.backgroundColor = .purple
return cell
}
func tableView(_ tableView: UITableView,heightForHeaderInSection section: Int) -> CGFloat {
return 10
}
func textFieldDidBeginEditing(_ textField: UITextField) {
// textField.addTarget(self,action: #selector(valueChanged),for: .editingChanged)
}
}
class AddFCCell: UITableViewCell {
// MARK: - Text Field 1
let textField1 : UITextField = {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.backgroundColor = .white
textField.isUserInteractionEnabled = true
textField.placeholder = "TYPE HERE SOMETHING"
textField.font = UIFont.systemFont(ofSize: 20)
return textField
}()
// MARK: - Text Field 2
let textField2 : UITextField = {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.backgroundColor = .white
textField.isUserInteractionEnabled = true
textField.placeholder = "TYPE HERE SOMETHING"
textField.font = UIFont.systemFont(ofSize: 20)
return textField
}()
// MARK: - view Did Load
override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
super.init(style: style,reuseIdentifier: reuseIdentifier)
contentView.addSubview(textField1)
contentView.addSubview(textField2)
configureTextBox1(textField: textField1)
configureTextBox2(textField: textField2)
}
// MARK: - Configure Text Box 1 Function
func configureTextBox1(textField : UITextField) {
textField.layer.cornerRadius = 20
}
// MARK: - Configure Text Box 2 Function
func configureTextBox2(textField : UITextField) {
textField.layer.cornerRadius = 20
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
解决方法
我会改变几件事,
1.去掉numberOfTextFields
2.使用var cards = [Cards]()
返回tableView中的单元格数量
3. 使用单个 cards
实例初始化 Cards
并将其属性设置为 nil。所以我将卡片实现为
struct Cards {
var frontLabel: String?
var backLabel: String?
}
4. 将 cards
数组初始化为
var cards = [Cards()]
5. 从数组 count 中返回行数
func numberOfSections(in tableView: UITableView) -> Int {
return cards.count
}
6. 我会将文本字段委托职责迁移到 Cell 而不是将其移动到 ViewController 并且我将在 AddFCCell
中有一个委托来更新 ViewController 的文本更改
@objc protocol AddFCCellDelegate {
func updateCard(with frontText: String?,backText: String?,for cell: AddFCCell)
}
class AddFCCell: UITableViewCell {
weak var delegate:AddFCCellDelegate?
//.... other codes of yours
}
extension AddFCCell: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
self.delegate?.updateCard(with: self.textField1.text,backText: self.textField2.text,for: self)
}
}
7. 最后,在 viewController 中实现/确认 AddFCCellDelegate
并重新加载 TableView bu 更新文本
extension ViewController: AddFCCellDelegate {
func updateCard(with frontText: String?,for cell: AddFCCell) {
guard let indexPath = self.tableView.indexPath(for: cell) else {
return
}
self.cards[indexPath.row].frontLabel = frontText
self.cards[indexPath.row].backLabel = backText
self.tableView.reloadRows(at: [indexPath],with: .automatic)
}
}
8. 更新 CellForRowAtIndexPath
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "AddFCCell") as! AddFCCell
cell.selectionStyle = .none
cell.delegate = self
cell.textField1.text = cards[indexPath.row].frontLabel
cell.textField2.text = cards[indexPath.row].backLabel
cell.backgroundColor = .purple
return cell
}
您显然可以实现一个有效的协议,并根据所有修改过的 textField 仅返回/更新 Cards 结构中的特定变量,但此处发布的代码只是为了给您一个想法并开始使用
编辑 1:
确保您已正确设置 TextFields 委托
override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
super.init(style: style,reuseIdentifier: reuseIdentifier)
contentView.addSubview(textField1)
textField1.delegate = self
contentView.addSubview(textField2)
textField2.delegate = self
configureTextBox1(textField: textField1)
configureTextBox2(textField: textField2)
}
,
您可以向两个文本字段添加占位符文本,确保两个占位符文本不同,这里我尝试将 uniq 标识符分配给带有标签的文本字段。
&
通过比较 textFieldDidBeginEditing 中的占位符文本来检索文本字段值。
cell.textField1.tag = indexPath.row
cell.textField2.tag = indexPath.row
cell.textField1.placeholder = "1"
cell.textField2.placeholder = "2"
func textFieldDidBeginEditing(_ textField: UITextField) {
if(textField.tag && placeholder){
}
}
这不是一个合适的解决方案,但通过这种方式您可以区分使用相同标签提交的两个文本。