Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:UITableView行项目在隐藏该行时未隐藏_Ios_Swift_Uitableview_Collapsable - Fatal编程技术网

Ios Swift:UITableView行项目在隐藏该行时未隐藏

Ios Swift:UITableView行项目在隐藏该行时未隐藏,ios,swift,uitableview,collapsable,Ios,Swift,Uitableview,Collapsable,我有一个表视图类和三个单元格类,用于填充表视图的3行 每当切换按钮关闭时,我想隐藏第二行。当我点击切换按钮时,行被折叠,但单元格项没有隐藏 这是我的密码: override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.row==0{ let cell=tableView

我有一个表视图类和三个单元格类,用于填充表视图的3行

每当切换按钮关闭时,我想隐藏第二行。当我点击切换按钮时,行被折叠,但单元格项没有隐藏

这是我的密码:

    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(){
}
}

我以编程的方式做每件事。请帮助我如何实现这一点,因为您将行高设置为
0
,所以单元格的内容会显示出来。。。但是这种显示/隐藏行的方法(以及设置视图的方式)不会改变该单元格的内容

因此,内容仍在显示,因为它延伸到单元格的边界以下

还有其他(可以说更好的)显示/隐藏行的方法,但请坚持您的方法

class CellBase
中的
setupview()
func更改为:

func setupViews(){

    // add this line
    self.clipsToBounds = true

    backgroundColor=UIColor.green

}

编辑

由于原始帖子中的代码不完整,我忘了注意到每个自定义单元格类都应该在其
setupview()
func:

override func setupViews(){
    // adding this line will allow you to put common setup tasks
    // in the setupViews() func in CellBase class
    super.setupViews()

    // do additional setup tasks that are specific to this cell class
    addSubview(containerView)
    setupContainerView()

    addConstraintsWithFormat(format: "H:|-20-[v0]-20-|", views: containerView)
    addConstraintsWithFormat(format: "V:|-15-[v0]-15-|", views: containerView)
}

您的
numberOfRowsInSection
处理程序在哪里?在tableView中使用numberOfRows处理此问题。例如,如果切换按钮设置为true,则在
numberOfRows:instation()中返回2,否则返回3
方法,并根据
cellForRowAt中的切换状态返回相应的单元格
我通过这种方法得到此错误:由于未捕获异常“NSInternalInconsistencyException”终止应用程序,原因:“无效更新:节0中的行数无效。”。更新(2)后现有节中包含的行数必须等于更新(3)前该节中包含的行数,加上或减去从该节中插入或删除的行数(0插入,0删除),加上或减去移入或移出该节的行数(0移入,0移出)当我将其添加到单元格基类时,它不起作用,但当我将其添加到oneButtonCell类的override setupViews func时,它起作用了。谢谢你的帮助。你能告诉我显示/隐藏行的其他方式吗?@FazeelaIqbal-请参阅我答案的编辑。因为您的原始代码不完整,所以我添加了一些东西(比如在
toggleCell
类中将开关添加到视图中)。至于显示/隐藏行的其他方式,这取决于您最终要做什么。对于您的特定(简单)示例,这种方法是有效的——尽管使用闭包/回调比给单元格一个控制器引用要好。根据您的需要,稍加搜索就会发现其他可能更好的方法。