Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从自定义uitableview单元格-Swift获取uitextfield数据_Ios_Iphone_Swift_Uitableview_Uitextfield - Fatal编程技术网

Ios 从自定义uitableview单元格-Swift获取uitextfield数据

Ios 从自定义uitableview单元格-Swift获取uitextfield数据,ios,iphone,swift,uitableview,uitextfield,Ios,Iphone,Swift,Uitableview,Uitextfield,我对带有文本字段的自定义tableview单元格有问题。因此,我有一个单独的类,用于一个包含textfield的单元格,但我无法在tableview类中检索数据。在tableview类和textFieldShouldReturn函数中有一个textfield的委托,但当我按下“完成”按钮时,什么也没有发生。哪里会有问题 非常感谢 下面是表视图的代码: class MainTVC: UITableViewController, UITextFieldDelegate{ var table

我对带有文本字段的自定义tableview单元格有问题。因此,我有一个单独的类,用于一个包含textfield的单元格,但我无法在tableview类中检索数据。在tableview类和textFieldShouldReturn函数中有一个textfield的委托,但当我按下“完成”按钮时,什么也没有发生。哪里会有问题

非常感谢

下面是表视图的代码:

class MainTVC: UITableViewController, UITextFieldDelegate{

    var tableParts: [Dictionary<String, Any>] = []

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        tableParts = [
            ["type": "title", "data": "Some data", "enabled": true],
            ["type": "date", "data": "Some data", "enabled": true],
            ["type": "location", "data": "Loading...", "enabled": true],
        ]
        tableView.reloadData()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }

    override func numberOfSections(in tableView: UITableView) -> Int { return 1 }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tableParts.count }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableParts[indexPath.row]
        switch(cell["type"] as! String) {
        ...
        case "textbox":
            let rTemplateTextBox = tableView.dequeueReusableCell(withIdentifier: "recapTextCell", for: indexPath) as! RTextCell
            rTemplateTextBox.textField.text = cell["data"] as? String ?? "No text"

            rTemplateTextBox.data = cell
            return rTemplateTextBox
        default:
            let cell = tableView.dequeueReusableCell(withIdentifier: "defCell", for: indexPath)
            cell.textLabel?.text = "Unknown type of cell!"
            return cell
        }

    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        print("Should return!")
        return true
    }
}
class MainTVC:UITableViewController、UITextFieldDelegate{
var tableParts:[字典]=[]
覆盖函数视图将出现(uo动画:Bool){
super.viewwillbeen(true)
tableParts=[
[“类型”:“标题”,“数据”:“某些数据”,“已启用”:真],
[“类型”:“日期”,“数据”:“某些数据”,“已启用”:真],
[“类型”:“位置”,“数据”:“加载…”,“启用”:真],
]
tableView.reloadData()
}
重写func viewDidLoad(){
super.viewDidLoad()
tableView.delegate=self
tableView.dataSource=self
}
重写func numberOfSections(在tableView:UITableView中)->Int{return 1}
重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{return tableParts.count}
重写func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
var cell=tableParts[indexPath.row]
开关(单元格[“类型”]为!字符串){
...
案例“文本框”:
让rTemplateTextBox=tableView.dequeueReusableCell(标识符为:“recapTextCell”,for:indexPath)作为!RTextCell
rTemplateTextBox.textField.text=单元格[“数据”]为?字符串??“无文本”
rTemplateTextBox.data=单元格
返回rTemplateTextBox
违约:
let cell=tableView.dequeueReusableCell(标识符为“defCell”,表示:indexath)
cell.textlab?.text=“未知类型的单元格!”
返回单元
}
}
func textField应该返回(textField:UITextField)->Bool{
textField.resignFirstResponder()辞职
打印(“应该返回!”)
返回真值
}
}
对于一个单元:

class RTextCell: UITableViewCell, UITextFieldDelegate {

    var textField = UITextField()
    var data: Dictionary<String, Any>?

    override func awakeFromNib() {
        super.awakeFromNib()

        textField.delegate = self

        let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height))

        textField = UITextField(frame: CGRect(x:0, y:0, width: self.frame.width, height: 40))
        textField.placeholder = "Your text here"
        textField.textColor = UIColor.white
        textField.tintColor = UIColor.white
        textField.backgroundColor = UIColor.clear
        textField.leftView = padding
        textField.leftViewMode = .always

        self.addSubview(textField)
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        print("Should return")
        return true
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        if data != nil {
            data!["data"] = textField.text
            print("DATA: \(data!)")
        } else {
            print("No data")
        }
    }
}
类RTextCell:UITableViewCell,UITextFieldDelegate{
var textField=UITextField()
var数据:字典?
重写func awakeFromNib(){
super.awakeFromNib()
textField.delegate=self
让padding=UIView(帧:CGRect(x:0,y:0,宽度:15,高度:self.frame.height))
textField=UITextField(帧:CGRect(x:0,y:0,宽度:self.frame.width,高度:40))
textField.placeholder=“此处的文本”
textField.textColor=UIColor.white
textField.tintColor=UIColor.white
textField.backgroundColor=UIColor.clear
textField.leftView=填充
textField.leftViewMode=.always
self.addSubview(文本字段)
}
func textField应该返回(textField:UITextField)->Bool{
textField.resignFirstResponder()辞职
打印(“应返回”)
返回真值
}
func textField编辑(textField:UITextField){
如果数据!=nil{
数据![“数据”]=textField.text
打印(“数据:\(数据!)”)
}否则{
打印(“无数据”)
}
}
}

您可以在声明
表视图的任何位置获取单元格
文本字段
数据,只需使用以下代码

let indexPath = IndexPath(row: yourRow, section: yourSection)
let cell:InputDataCell = yourTable.cellForRow(at: indexPath) as! InputDataCell

if (cell.yourTextFieald.text?.characters.count)! {
    print(cell.yourTextFieald.text!)                           
}
第一个问题——在您的cell类中,在
awakeFromNib()
中,您有:

// CREATE a UITextField
var textField = UITextField()
var data: Dictionary<String, Any>?

override func awakeFromNib() {
    super.awakeFromNib()

    // assign self as the delegate of textField
    textField.delegate = self

    let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height))

    // CREATE a NEW UITextField
    textField = UITextField(frame: CGRect(x:0, y:0, width: self.frame.width, height: 40))
接下来,考虑使用回调闭包,而不是传入一个“数据对象”进行尝试和操作

将单元格类更改为:

class RTextCell: UITableViewCell, UITextFieldDelegate {

    var textField = UITextField()

    // this will be our "call back" closure
    var didEndEditAction : ((String)->())?

    override func awakeFromNib() {
        super.awakeFromNib()

        textField.delegate = self

        let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height))

        // just set the frame, don't create a NEW textField
        textField.frame = CGRect(x:0, y:0, width: self.frame.width, height: 40)
        textField.placeholder = "Your text here"
        textField.textColor = UIColor.white
        textField.tintColor = UIColor.white
        textField.backgroundColor = UIColor.clear
        textField.leftView = padding
        textField.leftViewMode = .always

        self.addSubview(textField)

    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        print("Should return")
        return true
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        // call back using a closure
        didEndEditAction?(textField.text ?? "")
    }

}
然后按如下方式进行配置:

    case "textbox":
        let rTemplateTextBox = tableView.dequeueReusableCell(withIdentifier: "recapTextCell", for: indexPath) as! RTextCell
        rTemplateTextBox.textField.text = cell["data"] as? String ?? "No text"

        // setup the "call back" closure
        rTemplateTextBox.didEndEditAction = {
            (newText) in
            let cell = self.myData[indexPath.row]
            cell["data"] = newText
        }

        return rTemplateTextBox

请包括
UITableViewCell
子类和tableview控制器类的相关代码。@Cheslav我想我的答案解决了您的问题您正在RTextCell类中设置textfield.delegate。因此textFieldShouldReturn只在该类中有效。您将在何处使用textfield的数据。请解释一下?@AadilAli我想在我的tableview类中使用字段的文本,有一个字典,我想用每个文本字段的数据填充它。每个单元格中将有许多文本字段。“完成”按钮是您单元格的一部分吗?
    case "textbox":
        let rTemplateTextBox = tableView.dequeueReusableCell(withIdentifier: "recapTextCell", for: indexPath) as! RTextCell
        rTemplateTextBox.textField.text = cell["data"] as? String ?? "No text"

        // setup the "call back" closure
        rTemplateTextBox.didEndEditAction = {
            (newText) in
            let cell = self.myData[indexPath.row]
            cell["data"] = newText
        }

        return rTemplateTextBox