Настройте текст UITableViewCell внутри оператора защиты

У меня есть табличное представление, которое считывает информацию из массива массивов и отображает ее. Табличное представление имеет сворачиваемые ячейки для подкатегорий. Я не могу понять, как сделать так, чтобы мой текст TableView соответствовал ячейке-прототипу, которую я создал. Я создал файл .swift для ячейки с именем «autoClaimCell», идентификатор ячейки также «autoClaimCell», а метка внутри этой ячейки называется «autoClaimCellLabel». До того, как я сделал защитный оператор, он работал нормально, потому что позволял мне поместить «as! autoClaimCell» в конец оператора, который затем обращался к этому файлу для метки, но теперь, когда у меня есть защитный оператор, он не будет позвольте мне разместить "as! autoClaimCell" где угодно.

Вот мой код:

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableViewData[section].opened == true {
            return tableViewData[section].sectionData.count + 1
        } else {
            return 1
        }
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//        let cell = tableView.dequeueReusableCell(withIdentifier: "autoClaimCell", for: indexPath) as! autoClaimCell
//        cell.autoClaimCellLabel?.text = areaCategories[indexPath.row]
//        return cell
        let dataIndex = indexPath.row - 1

        if indexPath.row == 0 {
            guard let cell = tableView.dequeueReusableCell(withIdentifier: "autoClaimCell") else {return UITableViewCell()}
            cell.textLabel?.text = tableViewData[indexPath.section].title
            return cell
        } else {
            //Use different call indentifier if needed
            guard let cell = tableView.dequeueReusableCell(withIdentifier: "autoClaimCell") else {return UITableViewCell()}
            cell.textLabel?.text = tableViewData[indexPath.section].sectionData[dataIndex]
            return cell
        }

    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            if indexPath.row == 0 {

            if tableViewData[indexPath.section].opened == true {
                tableViewData[indexPath.section].opened = false
                let sections = IndexSet.init(integer: indexPath.section)
                tableView.reloadSections(sections, with: .none) // play around with animations
            } else {
                tableViewData[indexPath.section].opened = true
                let sections = IndexSet.init(integer: indexPath.section)
                tableView.reloadSections(sections, with: .none) // play around with animations
            }
        }
    }

Кроме того, как мне сделать так, чтобы список, отображаемый при расширении ячейки, соответствовал другому прототипу ячейки в процессе?


person Christian W    schedule 20.03.2020    source источник
comment
Я так понимаю, у вас 2 tableViewCell класса? Или 2 идентификатора?   -  person nighttalker    schedule 21.03.2020
comment
Нет, идентификатор ячейки tableView и быстрый класс tableViewCell имеют одно и то же имя. Дейл был прав в своем ответе о простом переключении ! к ?.   -  person Christian W    schedule 21.03.2020


Ответы (1)


Выражение в операторе guard-let должно оцениваться как необязательное. Использование как! заставит развернуть необязательный параметр, который либо завершится успешно, либо сгенерирует ошибку, но никогда не вернет необязательный параметр. Просто замените как! с как?

Что касается соответствия другому прототипу клетки. Вам нужно управлять этим с помощью вашей модели данных. У вас уже есть другие условия для строки индекса 0. Вы можете добавить условия для расширения или тому подобное.

person Dale    schedule 21.03.2020