UITableview中如何设计多个单元格的数组结构?

Posted

技术标签:

【中文标题】UITableview中如何设计多个单元格的数组结构?【英文标题】:How to design the array structure for Multiple cells in UITableview? 【发布时间】:2018-07-13 07:57:45 【问题描述】:

这是我的第一个ViewController,当我点击加号(+)按钮时,它会移动到SecondViewController

这是我的SecondViewController,在提供必填字段后,当我单击保存按钮时,它应该在我的tableview 相应的单元格(行政人员、高级管理人员、员工)中再添加一行。但它不会在相应的单元格中添加行。

这是我厌倦的代码

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)



我的班级

 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
   

【问题讨论】:

在您的secondViewController 中,您在哪里调用自定义委托方法? 显示您的第二页代码 显示您的 SecondViewController 代码 对变量和参数使用 lowerCamelCase swift.org/documentation/api-design-guidelines @AbecedarioPoint 是的,我已经编辑了我的代码,现在您可以查看 【参考方案1】:

您当前的代码是将新的EmployeeStatus 添加到employee 数组,而不是项目的EmployeeStatus.Name 数组和EmployeeStatus.Date 数组。

请试试这个代码。

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()

【讨论】:

我想,我在错误的地方重新加载 tableview,不确定 @Laxmipriya 在addData 方法处设置断点,检查它是否已被调用并且新项目是否已添加到employee 是的 addData() 调用正常,我得到了价值 @Laxmipriya 您可以通过不同的数据结构来避免它。数据结构有助于简化操作,而您显示的结构使添加员工变得复杂。 @NF Lee 非常感谢【参考方案2】:

您的数据看起来很有趣。它可能会更好地使用

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: []]

然后您可以添加员工:

guard let level = Level(rawValue: status) else 
    throw Errors.levelDoesNotExist(status)

employees[.level] = newEmployee

重新加载 tableView 就像你已经做的那样。只是数据的格式很奇怪。

最好在 addData 委托调用完成后关闭第二个 viewController,以便返回第一个以显示更新的数据。

【讨论】:

我已经做了,看看我写的。你试过整合它吗?【参考方案3】:

您必须将视图控制器设置为表视图委托和数据源。

添加到viewDidLoad 的末尾TableViewHeader 类:

override func viewDidLoad() 
    super.viewDidLoad()

    tableviewHeader.delegate = self
    tableviewHeader.dataSource = self

【讨论】:

【参考方案4】:

通过这种方式,您可以将值从一个视图控制器传递到另一个选项卡:

    首先打开 main.storyboard 选择第一个视图控制器并将 UItextField 和 UIButton 拖放到字段上。

【讨论】:

以上是关于UITableview中如何设计多个单元格的数组结构?的主要内容,如果未能解决你的问题,请参考以下文章

带有Swift的多个自定义单元格的UITableview

如何从自定义 UITableview 中检索有关选择单元格的数据

在单个 UIScrollview 中使用多个 UITableViews,如何仅加载可见单元格的单元格数据

如何让 UITableView 设置其单元格的插图而不在整个表格上设置插图?

带有多个自定义单元格的“UITableView 无法从其数据源获取单元格”

如何在 Swift 中动态更改包含 UICollectionView 单元格的 UITableView 单元格的高度?