LeiLei1 LeiLei1 - 2 months ago 21
iOS Question

add entires from textfield to UITableView to automatically populate

This is the code I have so far. I am able to enter into the textfield and have it appear in the UITableView, but only after I reload the page and come back to it. I want for what I enter into the textfield and when I click 'add' for it to automatically appear in the UITableView.

@IBOutlet var itemTextField: UITextField!
@IBOutlet var table: UITableView!

var items: [String] = []

@IBAction func add(_ sender: Any) {
let itemsObject = UserDefaults.standard.object(forKey: "items")

var items:[String]

if let tempItems = itemsObject as? [String] {
items = tempItems
items.append(itemTextField.text!)

print(items)
} else {
items = [itemTextField.text!]
}

UserDefaults.standard.set(items, forKey: "items" )
itemTextField.text = ""
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}

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

return true
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")

cell.textLabel?.text = items[indexPath.row]
cell.textLabel?.font = UIFont(name: "Type02", size: 20)

return cell
}

override func viewDidAppear(_ animated: Bool) {
let itemsOBject = UserDefaults.standard.object(forKey: "items")

if let tempItems = itemsOBject as? [String]{
items = tempItems
}

table.reloadData()
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
items.remove(at: indexPath.row)

table.reloadData()

UserDefaults.standard.set(items, forKey: "items")
}
}

Answer Source

It works for me .

Add outlet for textfield and tableview.

 @IBOutlet weak var nametextField: UITextField!
 @IBOutlet weak var dataTableView: UITableView!

Add IBAction for Add action button.

@IBAction func addNameToTable(_ sender: Any) {

        // Check for value in nameTextField
        guard let profilename = nametextField.text else{
          return
        }
        // Append text field value in data array
        data.append(profilename)
       // Reload table to show text field name in table
        dataTableView.reloadData()
    }

Create array to hold string values-:

var data = [String]()

Add table methods to populate data on table on clicking Add button.

func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }// Default is 1 if not implemented

    // return array count
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return data.count
    }

    // dequeue cell
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
        cell.textLabel?.text = data[indexPath.row]
        return cell
    }

    // Row height
    public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
        return 50
    }

COMPLETE CODE -:

import UIKit
import AVKit
class ViewController: UIViewController {

    @IBOutlet weak var nametextField: UITextField!
    @IBOutlet weak var dataTableView: UITableView!
    var data = [String]()

    //MArk-: ViewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func addNameToTable(_ sender: Any) {

        guard let profilename = nametextField.text else{
          return
        }
        data.append(profilename)
        dataTableView.reloadData()
    }
}

extension ViewController : UITableViewDelegate,UITableViewDataSource{

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }// Default is 1 if not implemented

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


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") 
        cell.textLabel?.text = data[indexPath.row]
        return cell
    }

    public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
        return 50
    }
}