【问题标题】:get tableview cell button to add a new tableview cell获取 tableview 单元格按钮以添加新的 tableview 单元格
【发布时间】:2020-10-20 06:29:13
【问题描述】:

我希望我的 swift 代码在每次按下按钮时添加一个新的 tableview 单元格。您可以在下面的 gif 中看到我正在寻找的内容。此代码应在 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 中添加按钮。每次按下 tableview 单元格按钮时,都会出现一个带有按钮的新单元格。

enter image description here

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    private let myArray: NSArray = ["First"]
     var myTableView =  UITableView()

    override func viewDidLoad() {
        super.viewDidLoad()

        myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
        myTableView.dataSource = self
        myTableView.delegate = self
        
        
        
        self.view.addSubview(myTableView)
        myTableView.translatesAutoresizingMaskIntoConstraints = false
       
myTableView.register(MyCell.self, forCellReuseIdentifier: "MyCell")
   

               
               NSLayoutConstraint.activate([

                   myTableView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.90),
                   myTableView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1),
                   myTableView.topAnchor.constraint(equalTo: view.topAnchor),
                   myTableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),



               ])
        
    }
    
   

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Num: \(indexPath.row)")
        print("Value: \(myArray[indexPath.row])")
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell
       
        cell.buttonTapCallback = {
           
        }
        return cell
    }
    
}
class MyCell: UITableViewCell {
    
    var buttonTapCallback: () -> ()  = { }
    
    let button: UIButton = {
        let btn = UIButton()
        btn.setTitle("Button", for: .normal)
        btn.backgroundColor = .systemPink
        btn.titleLabel?.font = UIFont.systemFont(ofSize: 14)
        return btn
    }()
    
    let label: UILabel = {
       let lbl = UILabel()
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.textColor = .systemPink
       return lbl
    }()
    
    @objc func didTapButton() {
        buttonTapCallback()
    }
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        //Add button
        contentView.addSubview(button)
        button.addTarget(self, action: #selector(didTapButton), for: .touchUpInside)
        
        //Set constraints as per your requirements
        button.translatesAutoresizingMaskIntoConstraints = false
        button.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20).isActive = true
        button.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
        button.widthAnchor.constraint(equalToConstant: 100).isActive = true
        button.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true
        
     
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

【问题讨论】:

    标签: swift uitableview button tableview init


    【解决方案1】:

    您可能错过了实际添加要显示的新项目

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell
           
        cell.buttonTapCallback = { [weak self] in
            guard let self = self else { return }
    
            self.myArray.append("NewItem")
            self.myTableView.reloadData()
        }
        return cell
    }
    

    【讨论】:

    • 我收到“NSArray”类型的值错误没有成员“附加”
    • 如果你想保存对象是什么?例如,如果是字符串,则将声明从 private let myArray: NSArray = ["First"] 更改为 private var myArray: [String] = ["First"]
    • 添加了它编译的代码,但没有添加按钮。这段代码什么也没发生。
    • 你的“MyCell”类,它是空的吗?
    【解决方案2】:

    tableView(_: cellForRowAt:) 中,您需要使用MyCell's init(style:reuseIdentifier:) 而不是dequeueReusableCell(withIdentifier:for:) 创建单元格,即

    let cell = MyCell(style: .default, reuseIdentifier: "MyCell")
    

    接下来,在buttonTapCallbackclosure 中,您需要向myArray 添加一个新元素并在myTableView 上调用reloadData(),即

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = MyCell(style: .default, reuseIdentifier: "MyCell")
        cell.buttonTapCallback = {[weak self] in
            self?.myArray.append("NewCell-\(indexPath.row)")
            self?.myTableView.reloadData()
        }
        return cell
    }
    

    注意:使用 Swift 时使用 Swift 类型而不是 Objective-C 类型。在您的代码中使用[String] 而不是NSArray

    【讨论】:

      猜你喜欢
      • 2013-05-10
      • 2017-11-19
      • 2015-09-17
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多