Difficulty loading sections in cellForRowAt

0

I'm having a little difficulty in implementing indexes (A through Z) in my app ... See the structure below, what should I do to properly load indexPath.section ?:

struct EmployeeDetails {
    let functionary: String
    let imageFace: String
    let phone: String

    init(dictionary: [String: Any]) {
        self.functionary = (dictionary["Functionary"] as? String) ?? ""
        self.imageFace = (dictionary["ImageFace"] as? String) ?? ""
        self.phone = (dictionary["Phone"] as? String) ?? ""
    }
}
struct Employee {
    let position: String
    let name: String
    let details: [EmployeeDetails] // [String:Any]

    init(dictionary: [String: Any]) {
        self.position = (dictionary["Position"] as? String) ?? ""
        self.name = (dictionary["Name"] as? String) ?? ""

        let t = (dictionary["Details"] as? [Any]) ?? []
        self.details = t.map({EmployeeDetails(dictionary: $0 as! [String : Any])})
    }
}

struct Shared {
    static var instance = Shared()
    var employees: [Employee] = []
}

I believe the error is in cellForRowAt in TableViewController :

@IBOutlet weak var searchBar: UISearchBar!

var employeesSearching = [Employee]()
var isSearching : Bool = false

let collation = UILocalizedIndexedCollation.current()
var sections: [[AnyObject]] = []
var objects: [AnyObject] = [] {
    didSet {
        let selector: Selector = #selector(getter: UIApplicationShortcutItem.localizedTitle)
        sections = Array(repeating: [], count: collation.sectionTitles.count)

        let sortedObjects = collation.sortedArray(from: objects, collationStringSelector: selector)
        for object in sortedObjects {
            let sectionNumber = collation.section(for: object, collationStringSelector: selector)
            sections[sectionNumber].append(object as AnyObject)
        }
        self.tableView.reloadData()
    }
}

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

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return isSearching ? employeesSearching.count : sections[section].count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell1
    let entry = isSearching ? employeesSearching[indexPath.row] : Shared.instance.employees[indexPath.row]

    //sections[indexPath.section][indexPath.row]   ??? COMO ???

    cell.nameLabel.text = entry.name
    cell.positionLabel.text = entry.position

    return cell
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return collation.sectionTitles[section]
}

override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
    return collation.sectionIndexTitles
}

override func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
    return collation.section(forSectionIndexTitle: index)
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if self.searchBar.text!.isEmpty {
        self.isSearching = false
        self.tableView.reloadData()
    } else {
        self.isSearching = true
        self.employeesSearching.removeAll(keepingCapacity: false)
        let searchText = self.searchBar.text!.lowercased()
        for employee in Shared.instance.employees {
            if employee.name.lowercased().range(of: searchText) != nil {
                self.employeesSearching.append(employee)
            }
        }
    }
        self.tableView.reloadData()
}

How do I implement sections , [indexPath.section] , and [indexPath.row] in the same line of code in this case?

    
asked by anonymous 10.04.2017 / 16:18

1 answer

1

I think the ideal is that your employeesSearching is a two-dimensional array already organized by sections.

That is, the employee who is in section 0 will be in employeesSearching [0] [i], which is 1, will be in employeeSearching [1] [i] and so on ...

Take your list, go through it organizing in a two-dimensional array and then you can, in cellForRowAt only make entry = employeesSearching [indexPath.section] [indexPath.row].

    
13.04.2017 / 21:48