Kevin
Kevin

Reputation: 1189

Table View Cell with a Textfield

I have a subclass, CustomCell, which inherits from my parent class, CreateEvent. The subclass describes the individual cells for the table view cell, which is on the CreateEvent View controller. In one specific cell, I have a textfield, that is linked to the CustomCell file, but I am having trouble getting the value from that textfield when a user enters into the textfield. I am also having trouble dismissing the keyboard with outside touches and pressing the return key, but I am primarily focused on getting the text from the textfield. I am familiar with doing these functionalities on a normal swift file but because this is a subclass, I'm not sure what to do. What I've tried is to use:

class CustomCell: UITableViewCell, UITextFieldDelegate {

@IBOutlet weak var entranceFeeTextField: UITextField!

override func awakeFromNib() {
     super.awakeFromNib()

}

override func setSelected(selected: Bool, animated: Bool) {
     super.setSelected(selected, animated: animated)
}

And:

class CreateEventVC: UIViewController, UITableViewDelegate, UITableViewDataSource, CustomCellDelegate, UITextFieldDelegate {

override func viewDidLoad() {
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let currentCellDescriptor = getCellDescriptorForIndexPath(indexPath)
    let cell = tableView.dequeueReusableCell(withIdentifier: currentCellDescriptor["cellIdentifier"] as! String, for: indexPath) as! CustomCell


    cell.entranceFeeTextField.delegate = self

    entranceFeeAmount = cell.entranceFeeTextField.text!
}

This code doesn't run and I'm not exactly sure which textfield delegates I need to run in order to be able to get the Text value from the textfield.

Upvotes: 0

Views: 5428

Answers (3)

Shemona Puri
Shemona Puri

Reputation: 811

This is working code , I get the value from text field and even keyboard is resigned.

var cell = TableViewCell() // customCell
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
         cell = tbl.dequeueReusableCell(withIdentifier: "CELL") as! TableViewCell
        cell.configure(text: "", placeholder: "EnterText")
        return cell
    }

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

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

func textFieldShouldReturn(_ textField: UITextField) -> Bool
{
     //cell = tbl.dequeueReusableCell(withIdentifier: "CELL") as! TableViewCell


   print( cell.returnTextOfTextField() )
    print(cell.txtField.text)
    cell.txtField .resignFirstResponder()
    return true
}




/// Custom cell class


class TableViewCell: UITableViewCell,UITextFieldDelegate
{

@IBOutlet weak var txtField: UITextField!
override func awakeFromNib()
{
    super.awakeFromNib()
    // Initialization code
}
public func configure(text: String?, placeholder: String) {
    txtField.text = text
    txtField.placeholder = placeholder

    txtField.accessibilityValue = text
    txtField.accessibilityLabel = placeholder
}

func returnTextOfTextField() -> String
{
    print(txtField.text)
   return txtField.text!
}
override func setSelected(_ selected: Bool, animated: Bool)
{
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state
}

}

Upvotes: 0

Shemona Puri
Shemona Puri

Reputation: 811

Here is the full code: (Xcode 8 swift 3)
(View Controller Class) 

class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate
{
    @IBOutlet weak var tbl: UITableView!
    var cell = TableViewCell()
    override func viewDidLoad()
    {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
         cell = tbl.dequeueReusableCell(withIdentifier: "CELL") as! TableViewCell
        cell.configure(text: "", placeholder: "EnterText")
        return cell
    }

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

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

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


       print( cell.returnTextOfTextField() )
        print(cell.txtField.text)
        cell.txtField .resignFirstResponder()
        return true
    }

}


TableViewCell class (Custom cell):
class TableViewCell: UITableViewCell,UITextFieldDelegate
{

    @IBOutlet weak var txtField: UITextField!
    override func awakeFromNib()
    {
        super.awakeFromNib()
        // Initialization code
    }
    public func configure(text: String?, placeholder: String) {
        txtField.text = text
        txtField.placeholder = placeholder

        txtField.accessibilityValue = text
        txtField.accessibilityLabel = placeholder
    }

    func returnTextOfTextField() -> String
    {
        print(txtField.text)
       return txtField.text!
    }
    override func setSelected(_ selected: Bool, animated: Bool)
    {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
    }

}


"CELL" is the identifier given to cell in Nib .

Upvotes: 1

Zolnoor
Zolnoor

Reputation: 699

You could use the UITextFieldDelegate methods textFieldShouldEndEditing(:) or textFieldShouldReturn(:) to get the results of the textfield.

for example:

func textFieldShouldEndEditing(textField: UITextField) -> Bool {
    print("TextField should end editing method called")
    let textFromCell = textField.text!
    //do whatever you want with the text!
    return true;
}

In this code snippet, textField will actually be your instance of entranceFeeTextField. Because somewhere, when that textfield stops editing, it calls self.delegate?.textFieldShouldEndEditing(entranceFeeTextField) and that method's implementation is inside your CreateEventVC.

Returning true will allow the textfield to end editing. This method will only get called when the user wants to stop editing. So you should remove entranceFeeAmount = cell.entranceFeeTextField.text! from your cellForRowAtIndexPath method because that's where you create your cell. At that point a user will not have typed into your textfield, so no use in getting the text from it as soon as it has been made.

All you have to do is implement one of those methods in CreateEventVC.

Upvotes: 1

Related Questions