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

时间:2017-07-26 07:59:07

标签: ios swift

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

如果用户单击“提交”按钮,我想循环到每一行,收集3个文本字段数据,并以数组或其他方式存储。

enter image description here

自定义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个文本字段数据? 感谢

4 个答案:

答案 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)")