【发布时间】:2020-07-01 19:24:59
【问题描述】:
我有一个表格视图类和三个单元格类,用于填充 3 行表格视图。screenshot of my table view
我想在切换按钮关闭时隐藏第二行。当我点击切换按钮时,行被折叠但单元格项目没有隐藏。scrrenshot after tapping toggle button
这是我的代码:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row==0{
let cell=tableView.dequeueReusableCell(withIdentifier: "cellid", for: indexPath) as! toggleCell
return cell
}
if indexPath.row==1{
let cell1=tableView.dequeueReusableCell(withIdentifier: "cellid2", for: indexPath) as! oneButtonCell
cell1.layer.backgroundColor=UIColor.purple.cgColor
return cell1
}
else{
let cell1=tableView.dequeueReusableCell(withIdentifier: "cellid1", for: indexPath)
cell1.layer.backgroundColor=UIColor.green.cgColor
return cell1
}
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row==1{
if istoggleOn==true{
return 75
}
else{
return 0
}
}
else{
return 75
}
}
}
class CellBase: UITableViewCell{
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style:style,reuseIdentifier:reuseIdentifier)
setupViews()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupViews(){
backgroundColor=UIColor.green
}
}
class toggleCell:CellBase{
let containerView=UIView()
let label:UILabel={
let label=UILabel()
label.text="Toggle Button"
label.textColor = .black
label.font=UIFont.init(name: "HelveticaNeue-Bold", size: 20)
return label
}()
lazy var button:UISwitch={
let toggle=UISwitch()
toggle.isOn=true
toggle.onTintColor=UIColor(red: 59/255, green: 178/255, blue: 250/255, alpha: 1)
toggle.addTarget(self, action: #selector(handleToggleAction), for: .valueChanged)
return toggle
}()
@objc func handleToggleAction(sender:UISwitch){
let parent = self.parentViewController as! ViewController
if sender.isOn{
print("on")
parent.istoggleOn=true
parent.tableView.beginUpdates()
parent.tableView.endUpdates()
}
else{
print("off")
parent.istoggleOn=false
parent.tableView.beginUpdates()
parent.tableView.endUpdates()
}
}
override func setupViews(){
addSubview(containerView)
setupContainerView()
addConstraintsWithFormat(format: "H:|-20-[v0]-20-|", views: containerView)
addConstraintsWithFormat(format: "V:|-15-[v0]-15-|", views: containerView)
}
func setupContainerView(){
}
class oneButtonCell:CellBase{
let containerView:UIView={
let view=UIView()
view.layer.cornerRadius=10
view.layer.borderColor=UIColor(red: 59/255, green: 178/255, blue: 250/255, alpha: 1).cgColor
view.layer.borderWidth=2
return view
}()
let label:UILabel={
let label=UILabel()
label.text="SomeText"
label.textColor = .black
label.font=UIFont.init(name: "HelveticaNeue-Bold", size: 20)
return label
}()
lazy var button:UIButton={
let button=UIButton()
button.setTitle("Button", for: .normal)
button.titleLabel?.font=UIFont.init(name: "HelveticaNeue-Bold", size: 20)
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.minimumScaleFactor = 0.5
button.setTitleColor(UIColor(red: 59/255, green: 178/255, blue: 250/255, alpha: 1), for: .normal)
let image=UIImage(named: "arrow")?.withRenderingMode(.alwaysTemplate)
button.setImage(image, for: .normal)
button.imageView?.tintColor = .gray
button.semanticContentAttribute = .forceRightToLeft
button.addTarget(self, action: #selector(preferenceMenu), for: .touchUpInside)
return button
}()
@objc func preferenceMenu(sender:UIButton){
print("drop")
}
override func setupViews(){
addSubview(containerView)
setupContainerView()
addConstraintsWithFormat(format: "H:|-20-[v0]-20-|", views: containerView)
addConstraintsWithFormat(format: "V:|-15-[v0(45)]-15-|", views: containerView)
}
func setupContainerView(){
}
}
我正在以编程方式做所有事情。请帮助我如何实现这一目标
【问题讨论】:
-
您的
numberOfRowsInSection处理程序在哪里? -
使用 tableView 中的 numberOfRows 处理这个问题。如果切换按钮设置为 true,则在
numberOfRows:inSection()方法中返回 2,否则返回 3,同样根据 @987654326 中的切换状态返回相应的单元格@ -
我使用这种方法收到此错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效。现有节中包含的行数更新后 (2) 必须等于更新前该节中包含的行数 (3),加上或减去从该节中插入或删除的行数(0 插入,0 删除),再加上或减去移入或移出该部分的行数(0 移入,0 移出)。'
标签: ios swift uitableview collapsable