заголовки удаляются при расширении раздела в UITableView - PullRequest
0 голосов
/ 24 апреля 2020

Я очень новичок в Swift и программирую для IOS, но я пытаюсь создать приложение. Я хочу иметь UITableView, где у меня есть несколько заголовков, которые, если вы нажмете на них, они будут открываться или закрываться в зависимости от того, открыты они или нет. Можно ли это сделать с заголовками или мне нужно будет использовать обычную ячейку? Вот как я все уладил. Спасибо за любую помощь?

Изменения:

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

она выглядит так, когда я что-то нажимаю.

Before clickafter click

var settings: [settingOptions] = [
    settingOptions(isOpened: true, setting: "appearance", options: ["light mode", "dark mode"]),
    settingOptions(isOpened: true, setting: "unit system", options: ["liters & milli liters", "ounzes"]),
    settingOptions(isOpened: true, setting: "change goal", options: ["goal"]),
    settingOptions(isOpened: true, setting: "how to use", options: []),
    settingOptions(isOpened: true, setting: "remove data", options: [])]
@objc func expandOrCollapsSection(_ sender: UIGestureRecognizer){
    print("Do something with section")
    guard let section = sender.view?.tag else { return }
    var indexPaths = [IndexPath]()
    for row in settings[section].options.indices {
        let indexPath = IndexPath(row: row, section: section)
        indexPaths.append(indexPath)
    }

    let ioOpend = settings[section].isOpened
    settings[section].isOpened = !ioOpend
    if ioOpend {
        tableView.deleteRows(at: indexPaths, with: .none)
    } else {
        tableView.insertRows(at: indexPaths, with: .none)
    }
}



extension AboutVC: UITableViewDelegate, UITableViewDataSource{

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "header") as! SettingOptionCell
        cell.setting = settings[indexPath.section].options[indexPath.row]

        return cell
    }

     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return settings[section].isOpened ? settings[section].options.count : 0
    }

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

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
         let cell = tableView.dequeueReusableCell(withIdentifier: "settingCell") as! SettingsCell
        cell.setting = settings[section]
        cell.selectionStyle = .none
        cell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(expandOrCollapsSection)))
        cell.tag = section
        return cell
    }
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
         return 60
    }


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    }

    }
}

class SettingOptionCell: UITableViewCell {
    var setting: String? {
        didSet {
            guard let string    = setting else {return}
            option.text         = string.capitalized
        }
    }
    let option: UILabel = {
        let lable           = UILabel()
        lable.text          = "test"
        lable.textColor     = UIColor.white
        lable.font          = UIFont(name: "AmericanTypewriter", size: 17)
        lable.translatesAutoresizingMaskIntoConstraints = false
        return lable
        }()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.addSubview(option)
        option.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 20).isActive = true
        option.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
        self.backgroundColor = .none
    }



    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class SettingsCell: UITableViewCell {
    var setting: settingOptions? {
        didSet {
            guard let setting = setting else {return}
            self.title.text = setting.setting.uppercased()
        }
    }
    var title: UILabel = {
        let lable       = UILabel()
        lable.text      = "Test"
        lable.font      = UIFont(name: "AmericanTypewriter", size: 20)
        lable.textColor = .white
        lable.translatesAutoresizingMaskIntoConstraints = false
        return lable
    }()
    var container: UIView = {
        let view                                        = UIView()
        view.clipsToBounds                              = true
        view.backgroundColor                            = .none
        view.translatesAutoresizingMaskIntoConstraints  = false
        return view
    }()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.backgroundColor                = .none
        self.isUserInteractionEnabled       = true
        contentView.addSubview(container)
        container.addSubview(title)
        title.leftAnchor.constraint(equalTo: container.leftAnchor).isActive                     = true
        title.centerYAnchor.constraint(equalTo: container.topAnchor,constant: 30).isActive      = true

        container.topAnchor.constraint(equalTo:contentView.topAnchor).isActive                  = true
        container.leftAnchor.constraint(equalTo:contentView.leftAnchor).isActive                = true
        container.rightAnchor.constraint(equalTo:contentView.rightAnchor).isActive              = true
        container.bottomAnchor.constraint(equalTo:contentView.bottomAnchor).isActive            = true
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Да, это возможно с заголовками, Добавить tag и UITapGestureRecogniser для всех представлений заголовков

Добавить isExpanded логический ключ к структуре данных настроек

здесь вы go, напишите метод действия для жеста

@objc func handleTapGesture(_ sender:UIGestureRecogniser) {
              let gesture = UIGestureRecognizer.init()
    guard let section = gesture.view?.tag else { return }
    let indexPaths = [IndexPath]()
    for row in settings[section].options.indices {
        let indexpath = IndexPath.init(row: row, section: section)
    }
    // revising the value....
    let isExpanded = settings[section].isExpanded
    settings[section].isExpanded = !isExpanded
    if isExpanded {
         tableView.deleteRows(at: indexPaths, with: .fade)
    } else {
         tableView.insertRows(at: indexPaths, with: .fade)
    }
}

Небольшое изменение количества строк метод

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return settings[section].isExpanded ? settings[section].options.count : 0
}

Рекомендую ниже видео. https://www.youtube.com/watch?v=Q8k9E1gQ_qg

0 голосов
/ 25 апреля 2020

Чтобы исправить проблему с исчезающими заголовками, я исправил это, изменив тип ячейки, используемый в качестве заголовка, на UITableViewHeaderFooterView.

class SettingsCell: UITableViewHeaderFooterView {
//init()
}

Зарегистрируйтесь следующим образом:

tableView.register(SettingsCell.self, forHeaderFooterViewReuseIdentifier: "header")

Отложите очередь так:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") as! SettingsCell
    cell.setting = settings[section]
    cell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(expandOrCollapsSection)))
    cell.tag = section
    return cell
}

И чтобы исправить, откройте и закройте раздел, я реализовал решение из sreekanth .

0 голосов
/ 24 апреля 2020

Определить переменную для сохранения статуса раздела представления таблицы

var isCollapsed:Bool = true

Затем вы можете добавить UITapGestureRecognizer в представление заголовка представления таблицы

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let cell = tableView.dequeueReusableCell(withIdentifier: "settingCell") as! SettingsCell
        cell.setting = settings[section]
        cell.selectionStyle = .none
        cell.isUserInteractionEnabled = true
        cell.tag = section
        cell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didMenuItemClicked(_:))))
        return cell
}

Следующий шаг, Вы хотите настроить ячейку табличного представления для поведения в соответствии с isCollapsed status

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if !isCollapsed {
            let cell = tableView.dequeueReusableCell(withIdentifier: "header") as! SettingOptionCell
            cell.setting = settings[indexPath.section].options[indexPath.row]
            return cell
        }else{
            let cell = UITableViewCell()
            cell.translatesAutoresizingMaskIntoConstraints = false
            cell.heightAnchor.constraint(equalToConstant: 0).isActive = true
            cell.widthAnchor.constraint(equalToConstant: 0).isActive = true
            return cell
        }

}

Теперь вы можете написать функцию для отображения, скрытия подпунктов,

@objc func didMenuItemClicked(_ sender : UITapGestureRecognizer){

        isCollapsed = !isCollapsed
        myTable.reloadSections([sender.view!.tag], with: .fade)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...