Swift 3/4 - заполнить данные только в желаемых ячейках tableView - PullRequest
0 голосов
/ 26 апреля 2018

Я заполняю свой tableView динамическими данными JSON. Я разработал собственный tableviewCell, где я скрываю представление и показываю только при наличии данных. Во-первых, я должен показать имена всех сотрудников в tableView, позже, когда им назначен какой-либо проект, затем я должен показать детали проекта в этом DetailsView, как показано ниже. enter image description here

Здесь я вызвал api projectDetails в forLoop для employeeIds в EmployeeList. Я сохраняю детали проекта в массиве и присваиваю значения строкам с помощью projectListArray[indexPath.row] в cellForRow . Но проблема в том, что, когда некоторым сотрудникам не назначен какой-либо проект, я получаю ошибку Индекс вне диапазона . ExpandableCell останется свернутым. Надеюсь, мне ясно до сих пор.

Таким образом, только сотрудники, которым назначены проекты, будут показывать расширенный ExpandableCell, для других ячейка будет свернута.

    public func getEmployeesList(request : EmployeesListRequest) {      // api call to get Employees List

        // if EmployeeListArray is not till and if response is SUCCESS, give ProjectDetails api call 

     if response.isSuccess() {
         for beds in array {
            self.getProjectDetails(request: self.projectDetailsRequest)
            //refresh TableView 
        }
    }                     
}

public func getProjectDetails(request : ProjectDetailsRequest) {

    if Network.response(response: response, errorMsg: nil) {
        let object = response.obj as? ProjectDetails                 
            if response.isSuccess() {
                if response.obj != nil {
                    self.projectDetailsArray.append(object!)
                    self.projectEmployeeIdArray.append(object.employeeId!)
                 }else{
                     print(“Project Object is nil\n")
                }
                }
            }
    }

// In cellForRowAt indexPath
// Displayed Employee names in NamesView now want to display project details
var expandedRows = Set<IndexPath>()
for id in projectEmployeeIdArray {
            if employeeId == id {
                cell.projectDetailsView.isHidden = false
                expandedRows.insert(indexPath)

                if !projectDetailsArray.isEmpty{
                        let sortedData = projectDetailsArray.sorted(by:{$0.employeeId < $1.employeeId})   //since the dictionary was not sorted. //Error if some ids nil
                    let details = sortedData[indexPath.row]             //Error because some employees do not project assigned.

                    cell.projectLabel.text = details.projectName!

                }else{                                        
                    expandedRows.remove(indexPath)
            }
        }
    }

Я также пытался projectDetailsArray[safe: indexPath.row], но ему не удалось назначить детали проекта проекта. Если бы в индексах 0 и 2 были детали проекта, он дал бы нулевые данные для индекса 2.

Требуется вывод: enter image description here

1 Ответ

0 голосов
/ 26 апреля 2018

Я бы настоятельно рекомендовал создать модель ваших данных, что-то вроде

struct Employee {
    var id = ""
    var name = ""
    var projects = [Project]()
}

struct Project {
    var name = ""
}

var model = [Employee]()

Если у вас есть это, вам нужно преобразовать ваш JSON-ответ в модель сотрудника / проекта отсортированным образом, как вам нравится.,Это нужно сделать только один раз, а не в каждом cellForRowAt indexPath вызове

. Реализация функций UITableViewDataSource довольно проста:

  • в numberOfSections(in:)вернуть число сотрудников в model
  • в tableView(_:numberOfRowsInSection:), получить сотрудника данного раздела и вернуть количество его проектов
  • в tableView(_:titleForHeaderInSection:), получить сотрудника вданный раздел и вернуть его имя (или как вы хотите, чтобы оно отображалось здесь)
  • в tableView(_:cellForRowAt:), получить сотрудника с указанным indexPath.section, получить проект этого сотрудника в соответствии с indexPath.row инастроить ячейку
...