lpd
lpd

Reputation: 175

How to design the array structure for Multiple cells in UITableview?

This is my first ViewController ,when I will click on plus(+) button, it will move to the SecondViewController

enter image description here

This is my SecondViewController, after giving the required field when I will click on save button it should add one more row in my tableview respective cell(executive,seniormanagement,staff). But it's not adding the row in respective cells.

enter image description here

This my code what i have tired

FirstViewController

  class TableViewHeader: UIViewController ,UITableViewDelegate,UITableViewDataSource,EmployeeProtocol{

 @IBOutlet weak var tableviewHeader: UITableView!


 var employee = [ EmployeeStatus(status:"Executive",Name:["Smith","Dev","Aryan"], Date:["Nov  14 1889","Dec  01  1980","Sep  18  1997"]),

                 EmployeeStatus(status:"SeniorManagement",Name:["Sourav","Smarak"], Date:[" April  10  1879"," Dec  11  1990"]),

                 EmployeeStatus(status:"Staff",Name:["Smith","Dev","Aryan","Suman"], Date:["Feb  14 1234"," Jan  01  1480","Sep  23  1994","July  10  1991"])]

@IBAction func plusButtonTapped(_ sender: UIButton) {
    performSegue(withIdentifier: "showSegue", sender:self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showSegue" {
        let createSegue = segue.destination as!  CreateEmployeeViewController

        createSegue.myEmpProtocol = self
    }
}

func numberOfSections(in tableView: UITableView) -> Int {
    return employee.count
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 50
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return employee[section].Name.count
}

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

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let Label = UILabel()
    Label.text = employee[section].status
    Label.backgroundColor = UIColor.gray
    return Label
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableviewHeader.dequeueReusableCell(withIdentifier: "TableHeaderCell", for: indexPath) as! TableViewHeadercell
    cell.NameLabel.text = employee[indexPath.section].Name[indexPath.row]
    cell.DateLabel.text = employee[indexPath.section].Date[indexPath.row]
    return cell
}

func addData(status:String, Name:[String], Date:[String]) {
    employee.append(EmployeeStatus(status:status, Name:Name, Date: Date))
    tableviewHeader.reloadData()
}
}

SeconViewController

    protocol EmployeeProtocol {
        func addData(status:String, Name:[String], Date:[String])
       }

   class CreateEmployeeViewController: UIViewController {

    var myEmpProtocol:EmployeeProtocol?


@IBOutlet weak var nameTextField: UITextField!

@IBOutlet weak var birthdayTextField: UITextField!

@IBOutlet weak var StatusSegment: UISegmentedControl!


var name  = [String]()
var DOB = [String]()
var status:String = ""

@IBAction func saveButtonTapped(_ sender: UIButton) {
    self.name = [nameTextField.text!]
    self.DOB = [birthdayTextField.text!]
    if StatusSegment.selectedSegmentIndex == 0 {
        self.status = "Executive"
    } else if StatusSegment.selectedSegmentIndex == 1{
        self.status = "SeniorManagement"
    }  else if StatusSegment.selectedSegmentIndex == 2 {
        self.status = "Staff"
    }
    myEmpProtocol?.addData(status:status, Name:name, Date:DOB)

}

@IBAction func CancelButtonTapped(_ sender: UIButton) {
    dismiss(animated: true, completion: nil)
}

}

MyClass

 import Foundation
  struct EmployeeStatus {
   var status:String
   var Name:[String]
   var Date:[String]
 init(status:String, Name:[String], Date:[String]){
    self.status = status
    self.Name = Name
    self.Date = Date
   }

Upvotes: 0

Views: 128

Answers (4)

NF Lee
NF Lee

Reputation: 482

Your current code is adding the new EmployeeStatus to employee array, not the item's EmployeeStatus.Name array and EmployeeStatus.Date array.

Please try this code.

func addData(status:String, Name:[String], Date:[String]) {
    var arr = [EmployeeStatus]()
    employee.forEach { ele in
        if ele.status == status {
            var e = ele
            e.Name.append(Name[0])
            e.Date.append(Date[0])
            arr.append(e)
        } else {
            arr.append(ele)
        }
    }
    employee = arr
    tableviewHeader.reloadData()
}

Upvotes: 2

fone ai
fone ai

Reputation: 1

In this way, you can pass value from one view controller to another tab:

  1. First of all open main.storyboard
  2. Select the First view controller and drag and drop UItextField and UIButton on the field.

Upvotes: 0

serg_zhd
serg_zhd

Reputation: 1043

You have to set your view controller as a table view delegate and datasource.

Add to the end of the viewDidLoad at TableViewHeader class:

override func viewDidLoad() {
    super.viewDidLoad()

    tableviewHeader.delegate = self
    tableviewHeader.dataSource = self
}

Upvotes: 0

Fabian
Fabian

Reputation: 5348

Your data looks interesting. It might work better with

enum Level: Int {
    case executive = 0, seniorManagement, staff
    var stringValue: { return (String:description: self).capitalizingFirstLetter }
}
struct Employee {
    let name: String
    let date: String
}

var employees: [Level: [Employee]] = [
    .executive: [Employee(name: "Smith", date: "Nov  14 1889"],
    .seniorManagement: [],
    .staff: []]

Then you can add employees with:

guard let level = Level(rawValue: status) else {
    throw Errors.levelDoesNotExist(status)
}
employees[.level] = newEmployee

Reloading the tableView works as you do already. Just the data is in a format where its weird to add to.

And best dismiss the second viewController once its finished after the addData delegate call so its going back to the first to show the updated data.

Upvotes: 0

Related Questions