Jaseel.Dev
Jaseel.Dev

Reputation: 769

How to add additional textfields by clicking button in table view

I am trying to add an option to add additional student fields inside table so that user can add more than one student name.

But I am confused how to do it using table view.

I am not interested in hiding view with specific number of fields.

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {


struct listItems{

    var title : String
    var isExpandable:Bool
    var maxFields :Int

    init(title:String,isExp:Bool,mxF:Int) {

        self.title = title
        self.isExpandable = isExp
        self.maxFields = mxF
    }

    }
@IBOutlet weak var tblListTable: UITableView!


let data : [listItems] = [listItems(title: "Name", isExp: false, mxF: 1), listItems(title: "Student Name", isExp: true, mxF: 20), listItems(title: "Email", isExp: false, mxF: 1)]


override func viewDidLoad() {
    super.viewDidLoad()

    tblListTable.delegate = self
    tblListTable.dataSource = self

    self.tblListTable.reloadData()
    print("isLoaded")

}

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


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

    return data.count

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    print("cellForRow")

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! ListCell


    cell.lblName.text = data[indexPath.row].title

    if data[indexPath.row].isExpandable == true {
        cell.btnAddField.isHidden = false
        print("ishidden")
    }
    else {
        cell.btnAddField.isHidden = true
    }


    return cell

}

}

List Cell Class

import UIKit

protocol AddFieldDelegate : class {
   func addField( _ tag : Int)
}

 class ListCell: UITableViewCell {

@IBOutlet weak var btnAddField: UIButton!
@IBOutlet weak var lblName: UILabel!
@IBOutlet weak var txtField: UITextField!


override func awakeFromNib() {

    super.awakeFromNib()
    // Initialization code
}

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

}

func addField( _ tag : Int){



}

}

enter image description here

Upvotes: 0

Views: 816

Answers (2)

joshLor
joshLor

Reputation: 1074

You are on the right track creating the AddFieldDelegate. However, rather than implementing the method inside the ListCell class you need to implement it in the ViewController.

First, change the view controller class definition line to:

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource, AddFieldDelegate {

This will allow you to call the delegate method from the view controller. Next, when you are creating your table view cells add the line:

cell.delegate = self

After that, move the method definition of the method addField to the view controller. So inside of your view controller add:

func addField(titleOfTextFieldToAdd: String, numberAssociatedWithTextFieldToAdd: Int) {
      data.append(listItems(title: titleOfTextFieldToAdd, isExp: false, mxF: numberAssociatedWithTextFieldToAdd))
      self.tableView.reloadData()
}

I used an example definition of the addField method but you can change it to anything that you would like, just make sure that you change the data array and reload the table view data.

Lastly, we must define the delegate in the ListCell class. So add this line to the ListCell class:

weak var delegate: MyCustomCellDelegate?

You can then add the text field by running the following anywhere in your ListCell class:

delegate?.addField(titleOfTextFieldToAdd: "a name", numberAssociatedWithTextFieldToAdd: 50)

For more information on delegation, look at the answer to this question.

Upvotes: 1

Suresh Mano
Suresh Mano

Reputation: 151

You have to append another item in your data array on button click and reload the tableview.

Upvotes: 0

Related Questions