问题描述
当点击每个人时,该人的下属列表应该出现在底部。整个列表是动态的。
{
"EmployeeId": "1","Name": "John","Position": "HR","Image": "","SubordinateCount": 6,"Subordinates": [
{
"EmployeeId": "2","Name": "Sub john 1","Position": "Manager","SubordinateCount": 1,"Subordinates": [
{
"EmployeeId": "3","Name": "Joseph","Position": "Admin","Subordinates": [
{
"EmployeeId": "4","Name": "Raj","Position": "Software Developer","SubordinateCount": 0,"Subordinates": []
}
]
}
]
},{
"EmployeeId": "5","Name": "Rahul","Position": "ERP Consultant","SubordinateCount": 16,"Subordinates": [
{
"EmployeeId": "6","Name": "Fam","Position": "QA","Image": null,"Subordinates": []
},{
"EmployeeId": "7","Name": "Salman A Q",{
"EmployeeId": "8","Name": "Mac",{
"EmployeeId": "9","Name": "Mathew",{
"EmployeeId": "10","Name": "Kim",{
"EmployeeId": "11","Name": "Loren",{
"EmployeeId": "12","Name": "Adam",{
"EmployeeId": "13","Name": "Meera",{
"EmployeeId": "14","Name": "MMM",{
"EmployeeId": "15","Name": "Master",{
"EmployeeId": "16","Name": "Michael",{
"EmployeeId": "17","Name": "George","Position": "Consultant",{
"EmployeeId": "18","Name": "Ahmedu A F",{
"EmployeeId": "19","Name": "KKKK",{
"EmployeeId": "20","Name": "xxx",{
"EmployeeId": "21","Name": "DK","Subordinates": []
}
]
},{
"EmployeeId": "22","Name": "HHHH","Position": "Engineer","Subordinates": [
{
"EmployeeId": "23","Name": "Ar","Position": "Technical",{
"EmployeeId": "24","Name": "Sun","Subordinates": [
{
"EmployeeId": "25","Name": "AAAA","Position": null,{
"EmployeeId": "26","Name": "CCCC","Subordinates": []
},{
"EmployeeId": "27","Name": "Jaaaa","SubordinateCount": 2,"Subordinates": [
{
"EmployeeId": "28","Name": "Jay","Position": "Ssssss",{
"EmployeeId": "29","Name": "NNNN","Position": "Sssss","Subordinates": [
{
"EmployeeId": "30","Name": "Jo","Subordinates": []
}
]
}
]
}
]
}
这是要使用的 json。我尝试在表视图中使用集合视图。但是当我尝试在用户移动到顶部并单击一个新人时删除一行时失败了。我已经看到许多库显示表视图的树结构。但我认为不能在这里使用。
这是我迄今为止尝试过的。
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return selectedindexes.count + 1
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var bottomCell : SubordinatesTableViewCell! = self.Extableview.dequeueReusableCell(withIdentifier: "SubordinatesTableViewCell") as? SubordinatesTableViewCell
if bottomCell == nil {
let nib:Array = Bundle.main.loadNibNamed("SubordinatesTableViewCell",owner: self,options: nil)!
bottomCell = nib[0] as? SubordinatesTableViewCell
}
bottomCell.empLevel = indexPath.row
bottomCell.delegate = self
bottomCell.subordinateDetails = self.subordinatesList
return bottomCell
}
extension CurrentVC : SubordinateCellDelegate {
func employeeClicked(row: Int?,index: Int?) {
self.subordinatesList = self.heirarchy?.subordinates
self.currentHeirarchyLevel = row! + 1
if self.Extableview.numberOfRows(inSection: 0) > row! + 1 {
var newIndexes = [Int]()
if row! == 0 {
self.selectedindexes.removeAll()
self.selectedindexes.append(index!)
}else {
for i in 0..<(row! + 1) {
newIndexes.append(selectedindexes[i])
}
self.selectedindexes = newIndexes
self.selectedindexes.append(index!)
}
for i in 0..<row! + 1 {
self.subordinatesList = self.subordinatesList?[self.selectedindexes[i]].subordinates
print(subordinatesList)
}
if subordinatesList?.count ?? 0 > 0 {
self.Extableview.reloadRows(at: [IndexPath(row: self.currentHeirarchyLevel,section: 0)],with: .fade)
}else {
for i in 0..<self.Extableview.numberOfRows(inSection: 0) {
if i > row! {
self.Extableview.beginUpdates()
self.Extableview.deleteRows(at: [IndexPath(row: 1,with: .fade)
}
}
self.numOfsections = row! + 1
self.Extableview.endUpdates()
}
}else {
self.selectedindexes.append(index!)
for i in 0..<row! + 1 {
self.subordinatesList = self.subordinatesList?[self.selectedindexes[i]].subordinates
}
if self.subordinatesList?.count ?? 0 > 0 {
self.Extableview.beginUpdates()
self.numOfsections = row! + 2
self.Extableview.insertRows(at: [IndexPath(row: row! + 1,with: .none)
self.Extableview.endUpdates()
}else {
for i in 0..<self.Extableview.numberOfRows(inSection: 0) {
if i > row! {
self.Extableview.beginUpdates()
self.numOfsections = row! + 1
self.Extableview.deleteRows(at: [IndexPath(row: 1,with: .fade)
}
}
self.Extableview.endUpdates()
}
}
}
}
解决方法
声明4个变量,
var heirarchy : Subordinates?
var numOfRows = 0
var subordinatesList : [Subordinates]?
var subList = [[Subordinates]?]()
一旦你得到 json 响应,
self.numOfRows += 1
self.subordinatesList?.append(self.heirarchy!)
self.subList.append([self.heirarchy!])
为集合视图项单击创建一个委托函数,如下所示。
func employeeClicked(row: Int?,index: Int?,subordinates: [Subordinates]?) {
if (subordinates?.count ?? 0) > 0 {
self.subordinatesList = subordinates
if numOfRows > row! + 2 {
self.tableView.beginUpdates()
for i in (row! + 1)..<tableView.numberOfRows(inSection: 0) {
self.tableView.deleteRows(at: [IndexPath(row: i,section: 0)],with: .fade)
self.numOfRows = numOfRows - 1
self.subList.removeLast()
}
self.subList.append(self.subordinatesList)
self.numOfRows = row! + 2
self.tableView.insertRows(at: [IndexPath(row: row! + 1,with: .fade)
self.tableView.endUpdates()
}
else if numOfRows == row! + 2 {
self.subList[row! + 1] = self.subordinatesList
self.tableView.reloadRows(at: [IndexPath(row: row! + 1,with: .fade)
}else {
self.subList.append(self.subordinatesList)
self.numOfRows = row! + 2
self.tableView.insertRows(at: [IndexPath(row: row! + 1,with: .fade)
}
}else {
if numOfRows > row! + 1 {
self.tableView.beginUpdates()
for i in (row! + 1)..<tableView.numberOfRows(inSection: 0) {
self.tableView.deleteRows(at: [IndexPath(row: i,with: .fade)
self.numOfRows = numOfRows - 1
self.subList.removeLast()
}
self.tableView.endUpdates()
}
}
self.tableView.scrollToBottom()
}
}
在行委托的表格视图单元格中使用子列表数组的值。 希望这对你有帮助。我检查了代码,它对我来说工作正常。