【问题标题】:TableView with custom cells doesn't begin editing带有自定义单元格的 TableView 不会开始编辑
【发布时间】:2021-02-08 17:28:37
【问题描述】:

我有一个包含自定义单元格的表格视图。单元格内部有一些按钮。 当我按下按钮使表格进入编辑模式时,它什么也没做。
如果我将单元格的类设置为 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)

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

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

【问题讨论】:

    标签: ios swift uitableview constraints


    【解决方案1】:

    应该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, target: self, 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),
            ])
        }
    }
    

    【讨论】:

    • 好的,谢谢,但它仍然没有进入编辑模式...
    • 我不明白这怎么可能,我注意到使用普通单元格时内容会稍微移动,我是否在约束设置中遗漏了什么?现在我完全按照你说的做了
    • @Mommy - 好吧,不知道你可能会错过什么......我添加了一个完整的例子供你尝试,然后与你正在做的事情进行比较。
    • 嗯,我不知道发生了什么,但现在它就像一个魅力。十分感谢。你很有帮助❤️❤️❤️
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2011-09-16
    相关资源
    最近更新 更多