Я очень новичок в Swift и программирую для IOS, но я пытаюсь создать приложение. Я хочу иметь UITableView, где у меня есть несколько заголовков, которые, если вы нажмете на них, они будут открываться или закрываться в зависимости от того, открыты они или нет. Можно ли это сделать с заголовками или мне нужно будет использовать обычную ячейку? Вот как я все уладил. Спасибо за любую помощь?
Изменения:
Теперь я могу открывать и закрывать разделы, но некоторые удаляются. Я обновил код с изменениями, которые я сделал до сих пор.
она выглядит так, когда я что-то нажимаю.
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")
}
}