【发布时间】:2020-08-08 08:26:31
【问题描述】:
我对 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")
}
}
【问题讨论】:
标签: ios swift uitableview user-interface