我有自定义单元格的tableview。 每个单元格有3个文本字段:dayInWeek,startTime,endTime。 在下图中,它有2行。但是用户可以单击+按钮添加更多行。
如果用户单击“提交”按钮,我想循环到每一行,收集3个文本字段数据,并以数组或其他方式存储。
自定义TableViewCell:
import UIKit
class RegularScheduleCell: UITableViewCell {
@IBOutlet weak var dayInWeek: UITextField!
@IBOutlet weak var startTime: UITextField!
@IBOutlet weak var endTime: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
}
一个视图控制器:
import UIKit
class RegularScheduleVC: UIViewController, UITableViewDelegate,UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var numOfRow = 1
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numOfRow
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "RegularScheduleCell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! RegularScheduleCell
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == UITableViewCellEditingStyle.delete) {
numOfRow -= 1
self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.right)
tableView.reloadData()
}
}
func insertNewRow(_ sender: UIBarButtonItem) {
if numOfRow < 7 {
numOfRow += 1
tableView.reloadData()
}
}
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
tableView.setEditing(editing, animated: animated)
}
}
此时,我尝试使用UITextFieldDelegate
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "RegularScheduleCell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! RegularScheduleCell
cell.dayInWeek.delegate = self
cell.startTime.delegate = self
cell.endTime.delegate = self
return cell
和
func textFieldDidEndEditing(_ textField: UITextField) {
allCellsText.append(textField.text!) //allCellsText is an array
print(allCellsText)
}
以便用户完成编辑后,将该数据添加到数组中。 但是,这不符合我的要求,因为:
在同一个单元格上:无法知道数据是属于dayOfWeek,还是startTime,还是endTime
在2个不同的单元格上:无法知道数据是否属于第一单元格的dayOfWeek或第二单元格的dayOfWeek。
因此,如何循环到所有单元格,获取所有3个文本字段数据? 感谢
答案 0 :(得分:1)
方法1:
将一组密钥对设为 -
var arrayOfKeyPairs = [[String:Any]]()
arrayOfKeyPairs.append(["header":"xx",
"value" : "",
“id”: "dsd",
"order" : 0])
我们只是将用户输入值替换为默认值为 -
func textFieldDidEndEditing(_ textField: UITextField) {
let center: CGPoint = textField.center
let rootViewPoint: CGPoint = textField.superview!.convert(center, to: tableView)
let indexPath: IndexPath = tableView.indexPathForRow(at: rootViewPoint)! as IndexPath
arrayOfKeyPairs[indexPath.row ]["value"] = textField.text//here you are appending(replacing) data to array
}
点击提交按钮,交叉检查收到的内容 -
func tapsOnNext(){
self.view.endEditing(true)//for adding last text field value with dismiss keyboard
print(arrayOfKeyPairs)
}
方法2:
我们可以通过访问特定indexpath
为
func tapsOnNext(){
let indexpath = IndexPath(row: 0, section: 0)
let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
print(cell.myTextField.text)
}
答案 1 :(得分:0)
您可以通过将目标添加到UITextField
UITextField
的文字
cell.YOUR_TEXTFIELD.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
//EditingChanged is one of the events and will be fired whenever the user changes any character in that UITextField.
之后,你可以这样调用你的函数:
func textFieldDidChange(textField: UITextField) {
//your code
}
请勿忘记为UITableViewCell
创建课程,并在该自定义IBOutlet
课程中创建所有UITextField
的{{1}}
答案 2 :(得分:0)
您可以通过以下方式进行操作。 首先,您可以创建一个对象,例如&#34;历史&#34; 使其属性如daysInWeek,startTime,endTime。
在viewDidLoad方法中,您可以定义一个对象数组。填充数组中的数据,或保存&#34;历史记录&#34;您在此数组中创建的。 将表视图的dataSource设置为此数组。 在您的方法cellForRowAtIndexPath中,您可以访问上面创建的数组的元素。
当您点击加号按钮时,您可以创建一个新的历史对象,将该对象保存在数组中并重新加载表视图。
如果您可以分享此代码的git repo,我将展示如何完成此操作。
答案 3 :(得分:0)
简单代码:点击按钮从单元格的文本字段中获取单元格数据
let indexpath = IndexPath(row: 0, section: 1)
let cell = ItemtableView.cellForRow(at: indexPath) as! CustomTableViewCell
print("text \(cell.myTextField.text)")