如何从UITableViewCell获取文本字段的值?

时间:2016-12-19 10:00:57

标签: swift xcode uitableview swift3

所以我有UITableView这个有{4} UITextField的单元格,我想在点击按钮时获取它们的值。

此代码不会检索任何值。

@IBAction func printBtnAction(_ sender: Any) {

    let cell = self.myTableView.dequeueReusableCell(withIdentifier: "manualAddC1") as! AddFriendC1Cell

    let alias = cell.aliasTextField.text!
    let primaryPhone = cell.primaryPhoneTextField.text!
    let secondaryPhone = cell.seondaryPhoneTextField.text!
    let email = cell.emailAddressTextField.text!

    print("Alias: \(alias), Phone: \(primaryPhone), Phone2: \(secondaryPhone), Email: \(email)")
}

这是TableView的屏幕截图 enter image description here

6 个答案:

答案 0 :(得分:13)

我终于通过这个简单的解决方案找到了它。

@IBAction func saveBtnAction(_ sender: Any) {

    let index = IndexPath(row: 0, section: 0)
    let cell: AddFriendC1Cell = self.myTableView.cellForRow(at: index) as! AddFriendC1Cell
    self.alias = cell.aliasTextField.text!
    self.primaryPhone = cell.primaryPhoneTextField.text!
    self.secondaryPhone = cell.seondaryPhoneTextField.text!
    self.email = cell.emailAddressTextField.text!

    print("Alias: \(self.alias), Phone: \(self.primaryPhone), Phone2: \(self.secondaryPhone), Email: \(self.email)")
}

答案 1 :(得分:8)

行。按下按钮时,您将使tableViewCell出列。

let cell = self.myTableView.dequeueReusableCell(withIdentifier: "manualAddC1") as! AddFriendC1Cell

我相信您希望获得对现有tableViewCell的引用,如下所示:

   if let cell = tableView.cellForRow(at: indexPath) as? AddFriendC1Cell {
        // do what you need with cell
    }

即使这样可行,我也不建议采用这种方法。如果用户使用像iPhone 4这样的小屏幕手机并且屏幕上看不到某些单元格会怎么样?我认为在这种情况下tableView.cellForRow会为不可见的单元格返回nil

我建议在每个单元格中使用带有tableView的viewController委托的文本字段实现textField:shouldChange。当在单元格中更改文本时,委托应该将更改传播到viewController,这会将值保存在实例变量中。

然后,当您按下按钮时,您只需从实例变量中获取值。

答案 2 :(得分:0)

我认为你的tableViewCells不是动态的。 您的单元格方法将如下所示。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID") as! YourClass
    cell.yourTextField.tag = indexPath.row
//
// Alias will be tag 0
// Primary Phone will be tag 1
// Secondary Phone will be tag 2 
// Email Address will be tag 3, so on and so forth
// Then, attach to each delegate
//
    cell.yourTextField.delegate = self
}

在UITableView处理类(符合UITextFieldDelegate协议)中,写下来。

func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {
let kActualText = (textField.text ?? "") + string
switch textField.tag
{
case 0:
    aliasValueHolder = kActualText;
case 1:
    primaryPhoneValueHolder = kActualText;
case 2:
    secondaryPhoneValueHolder = kActualText;
case 3:
    emailAddressValueHolder = kActualText;
default:
    print("It is nothing");
}
return true;
}

然后你可以提交它。

答案 3 :(得分:0)

我认为,您应该在tableCell类中实现TextField委托方法,并在tableCell类中管理所有验证和输入文本。

现在,您将需要获取所有输入的值,为此,您必须在tableCell类中使用Protocol,并使用委托将输入的值发送给viewController以及带有标签的标签,以识别输入了哪个值,例如电话号码或电子邮件。

使用这种方式,您的代码将被简化和结构化。

快乐编码!

答案 4 :(得分:0)

//第一步

在UITableViewCell中

import UIKit

@objc protocol TableViewDelegate: NSObjectProtocol{

    func afterClickingReturnInTextField(cell: ThirdTableCell)
}

class TableViewCell: UITableViewCell, UITextFieldDelegate {

    @IBOutlet weak var enterTextField: UITextField!
    weak var tableViewDelegate: TableViewDelegate?


    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        enterTextField.delegate = self   
    }

    // @IBAction Of UITextfiled 
    @IBAction func tapHerre(_ sender: UITextField) {

        tableViewDelegate?.responds(to: #selector(TableViewDelegate.afterClickingReturnInTextField(cell:)))
        tableViewDelegate?.afterClickingReturnInTextField(cell: self)
    }

    // UITextField Defaults delegates
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {

        enterTextField.resignFirstResponder()
        return true
    }
    func textFieldDidEndEditing(_ textField: UITextField) {

        enterTextField = textField
    }  
}

//第二步

在UITableViewCell中

extension ViewController: UITableViewDelegate, UITableViewDataSource, TableViewDelegate {

    var valueToPass : String?

    func afterClickingReturnInTextField(cell: ThirdTableCell) {

        valueToPass = cell.enterTextField.text
    }

    func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return youArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableview.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
        cell.enterTextField.text = youArray[indexPath.row]
        cell.tableViewDelegate = (self as TableViewDelegate)
        return cell
    }
}

键盘消失后,您可以在valueToPass中找到TextField值

答案 5 :(得分:-1)

func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {
    //        let kActualText = (textField.text ?? "") + string

    var kActualText = (textField.text! as NSString).replacingCharacters(in: range, with: string)

    kActualText = kActualText.trimmingCharacters(in: .whitespaces)

    if textField.tag == 0
    {
        email_address = kActualText;
    }
    else if textField.tag == 3
    {
        password = kActualText;
    }
    else
    {
        print("It is nothing")
    }

    return true;
}