Ios 检索自定义单元格内的textfield.text

Ios 检索自定义单元格内的textfield.text,ios,swift,Ios,Swift,我有一个具有自定义单元格的tableview。 每个单元格有3个文本字段:dayInWeek、startTime、endTime。 在下图中,它有两行。但用户可以单击+按钮添加更多行 若用户点击提交按钮,我想循环到每一行,收集3个文本字段的数据,并存储在数组中或其他任何地方 自定义TableViewCell: import UIKit class RegularScheduleCell: UITableViewCell { @IBOutlet weak var d

我有一个具有自定义单元格的tableview。 每个单元格有3个文本字段:dayInWeek、startTime、endTime。 在下图中,它有两行。但用户可以单击+按钮添加更多行

若用户点击提交按钮,我想循环到每一行,收集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)
    }
    
    
}

这样,当用户完成编辑后,就可以将该数据添加到数组中。 但是,这不符合我的要求,因为:

  • 在同一单元格上:无法知道数据是否属于dayOfWeek、startTime或endTime

  • 在两个不同的单元格上:无法知道数据是否属于第一个单元格的星期几或第二个单元格的星期几

因此,如何循环到所有单元格,获取所有3个文本字段数据?
谢谢

通过向
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
创建类,并在该自定义
单元格中为所有
UITextField
创建
IBOutlet
,您可以通过将目标添加到
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
创建类,并在该自定义
cell
中创建所有
UITextField
IBOutlet
,您可以通过以下方法完成。 首先,您可以创建一个对象,例如“历史” 将其属性设置为daysInWeek、startTime和endTime

在viewDidLoad方法中,定义一个对象数组。填充数组中的数据,或保存在此数组中创建的“历史”对象。 将表视图的数据源设置为此数组。 在方法cellForRowAtIndexPath中,可以访问上面创建的数组的元素

单击加号按钮时,可以创建一个新的历史对象,将该对象保存在数组中并重新加载表视图


如果您可以共享这段代码的git repo,我将展示如何实现这一点

你可以用下面的方法来做。 首先,您可以创建一个对象,例如“历史” 将其属性设置为daysInWeek、startTime和endTime

在viewDidLoad方法中,定义一个对象数组。填充数组中的数据,或保存在此数组中创建的“历史”对象。 将表视图的数据源设置为此数组。 在方法cellForRowAtIndexPath中,可以访问上面创建的数组的元素

单击加号按钮时,可以创建一个新的历史对象,将该对象保存在数组中并重新加载表视图


如果您可以共享这段代码的git repo,我将展示如何实现这一点

方法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: 我们可以通过使用特定的
indepath
as访问单元格来获取单元格数据

func tapsOnNext(){
     let indexpath = IndexPath(row: 0, section: 0)
     let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
     print(cell.myTextField.text)
  }

方法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: 我们可以通过使用特定的
indepath
as访问单元格来获取单元格数据

func tapsOnNext(){
     let indexpath = IndexPath(row: 0, section: 0)
     let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
     print(cell.myTextField.text)
  }

简单代码:在按钮上单击“从单元格文本字段获取单元格数据”

 let indexpath = IndexPath(row: 0, section: 1)
 let cell = ItemtableView.cellForRow(at: indexPath) as! CustomTableViewCell
 print("text \(cell.myTextField.text)")

简单代码:在按钮上单击“从单元格文本字段获取单元格数据”

 let indexpath = IndexPath(row: 0, section: 1)
 let cell = ItemtableView.cellForRow(at: indexPath) as! CustomTableViewCell
 print("text \(cell.myTextField.text)")

您不能在单元格上循环,因为屏幕外的单元格不可用。您需要将数据存储在视图控制器中(例如,在阵列中)。创建协议,使视图控制器成为自定义单元格的委托,并在文本更改时使自定义单元格调用适当的委托方法,以便视图控制器可以更新数据模型如果创建单元格数据类的数据源数组,则可以将对象传递给单元格,然后为其赋值,提交后,您可以读取包含textfield值对象的数组。您可以使用[textfield setTag:]将indexath.row作为标记添加到单元格中,然后在委托方法TextFieldDiEndEditing中获取该标记,该标记将作为数组中的位置,然后在该位置上更新。感谢所有评论。老实说,我是iOS开发人员的新手。有人能用代码发布答案以便我更好地理解吗?@John你的问题解决了吗?你不能在单元格上循环,因为屏幕外的单元格不可用。您需要将数据存储在视图控制器中(例如,在阵列中)。创建协议,使视图控制器成为自定义单元格的委托,并在文本更改时使自定义单元格调用适当的委托方法,以便视图控制器可以更新数据模型如果创建单元格数据类的数据源数组,则可以将对象传递给单元格,然后为其赋值,提交后,您可以读取包含textfield值对象的数组。您可以使用[textfield setTag:]将indexath.row作为标记添加到单元格中,然后在委托方法TextFieldDiEndEditing中获取该标记,该标记将作为数组中的位置,然后在该位置上更新。感谢所有评论。老实说,我是iOS开发人员的新手。有人能用代码发布答案以便我更好地理解吗?@John你的问题解决了吗?