微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有自定义单元格的 TableView 不会开始编辑

如何解决带有自定义单元格的 TableView 不会开始编辑

我有一个带有自定义单元格的表格视图。单元格内部有一些按钮。 当我按下按钮使表格进入编辑模式时,它什么也不做。
如果我将单元格的类设置为 UITableViewCell 那么它就可以工作了。 奇怪的是,如果我将表格视图认设置为处于编辑模式,那么当我启动应用程序时,表格处于编辑模式。 唯一的问题是当我按下应该将其设置为编辑模式的按钮时。

编辑按钮:

@objc func didTapEdit(sender: AnyObject){
    if table.isEditing == false{
        table.isEditing = true
        print("okokokok")
    } else {
        table.isEditing = false
    }
}
//This works properly with table views with default cells

表设置:

view.addSubview(table)
table.translatesAutoresizingMaskIntoConstraints = false
table.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
table.topAnchor.constraint(equalTo: view.topAnchor,constant: navBarHeight).isActive = true
table.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant: 30).isActive = true
table.trailingAnchor.constraint(equalTo: view.trailingAnchor,constant: -30).isActive = true       

自定义单元格:

contentView.addSubview(btn)
btn.translatesAutoresizingMaskIntoConstraints = false
btn.topAnchor.constraint(equalTo: topAnchor,constant: topSpace).isActive = true
btn.bottomAnchor.constraint(equalTo: bottomAnchor,constant: -5).isActive = true
btn.trailingAnchor.constraint(equalTo: trailingAnchor,constant: -5).isActive = true
let btnWidth = NSLayoutConstraint(item: btn,attribute: .width,relatedBy: .equal,toItem: nil,attribute: .notAnAttribute,multiplier: 0.0,constant: bounds.height-10)
btn.addConstraint(btnWidth)

我有多个按钮,我以同样的方式设置。

那么问题出在哪里呢?我使用自定义单元格创建了其他表格视图,它们都运行良好。另外,如果我将表格视图设置为认处于编辑模式,当我运行应用程序时,它处于编辑模式,我可以移动单元格!这里发生了什么?我认为问题可能在于我如何设置约束,但我真的不知道

解决方法

应该将您的btn添加到单元格的contentView中。但随后您将按钮限制在 cell 上,您不应该这样做。将您的约束更改为:

contentView.addSubview(btn)
btn.translatesAutoresizingMaskIntoConstraints = false

btn.topAnchor.constraint(equalTo: contentView.topAnchor,constant: topSpace).isActive = true
btn.bottomAnchor.constraint(equalTo: contentView.bottomAnchor,constant: -5).isActive = true
btn.trailingAnchor.constraint(equalTo: contentView.trailingAnchor,constant: -5).isActive = true
let btnWidth = NSLayoutConstraint(item: btn,attribute: .width,relatedBy: .equal,toItem: nil,attribute: .notAnAttribute,multiplier: 0.0,constant: bounds.height-10)
btn.addConstraint(btnWidth)

作为旁注,您的 btnWidth 约束看起来很奇怪……如果您希望按钮宽度比单元格的高度小 10 磅,您应该能够通过以下方式获得:

btn.widthAnchor.constraint(equalTo: contentView.heightAnchor,constant: -10)

编辑——这里是一个完整的例子...向导航栏添加一个“编辑”按钮,在编辑和非编辑之间切换:

class EditTestTableViewController: UITableViewController {

    lazy var editBtn = UIBarButtonItem(barButtonSystemItem: .edit,target: self,action: #selector(self.editTapped(_:)))
    lazy var doneBtn = UIBarButtonItem(barButtonSystemItem: .done,action: #selector(self.editTapped(_:)))

    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.register(EditTestCell.self,forCellReuseIdentifier: "cell")
        
        self.navigationItem.rightBarButtonItem = editBtn
    }
    override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return 8
    }
    override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let c = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath) as! EditTestCell
        c.label.text = "\(indexPath)"
        return c
    }
    @objc func editTapped(_ sender: Any) -> Void {
        tableView.isEditing.toggle()
        self.navigationItem.rightBarButtonItem = tableView.isEditing ? doneBtn : editBtn
    }
    override func tableView(_ tableView: UITableView,moveRowAt sourceIndexPath: IndexPath,to destinationIndexPath: IndexPath) {
        // handle moving row...
    }
    override func tableView(_ tableView: UITableView,commit editingStyle: UITableViewCell.EditingStyle,forRowAt indexPath: IndexPath) {
        // handle delete row...
    }
    
}

和一个简单的自定义单元格类:

class EditTestCell: UITableViewCell {
    let btn = UIButton()
    let label = UILabel()
    
    override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
        super.init(style: style,reuseIdentifier: reuseIdentifier)
        commonInit()
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() -> Void {
        btn.backgroundColor = .red
        btn.setTitle("Test",for: [])
            
        label.backgroundColor = .green
        
        contentView.addSubview(label)
        label.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(btn)
        btn.translatesAutoresizingMaskIntoConstraints = false
        
        NSLayoutConstraint.activate([
            btn.topAnchor.constraint(equalTo: contentView.topAnchor,constant: 12.0),btn.bottomAnchor.constraint(equalTo: contentView.bottomAnchor,constant: -12.0),btn.trailingAnchor.constraint(equalTo: contentView.trailingAnchor,constant: -5.0),btn.widthAnchor.constraint(equalTo: contentView.heightAnchor,constant: -10.0),label.leadingAnchor.constraint(equalTo: contentView.leadingAnchor,constant: 5.0),label.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),])
    }
}

enter image description here enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。