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中如何设计多个单元格的数组结构?的主要内容,如果未能解决你的问题,请参考以下文章
如何从自定义 UITableview 中检索有关选择单元格的数据
在单个 UIScrollview 中使用多个 UITableViews,如何仅加载可见单元格的单元格数据
如何让 UITableView 设置其单元格的插图而不在整个表格上设置插图?