单击tableView后隐藏xib的自定义UITableViewCell

Posted

技术标签:

【中文标题】单击tableView后隐藏xib的自定义UITableViewCell【英文标题】:Custom UITableViewCell with xib hiding after click on tableView 【发布时间】:2019-12-03 18:34:04 【问题描述】:

我正在尝试使用 UITableView 以编程方式构建一个带有自定义单元格的 tableView,而不使用 Storyboard,但是在我完成教程并尝试运行我构建的 CustomCell 应用程序后,

自定义单元格显示,但一旦我点击 tableView 自定义单元格隐藏

有人可以检查我是否错过了什么吗? 或者将xib与以编程方式制作的tableView一起使用可能是错误的?

HomeViewController.swift

class HomeViewController: UIViewController 

    fileprivate let homeTableView: UITableView = 
        let htm = UITableView()
        htm.translatesAutoresizingMaskIntoConstraints = false
        return htm
    ()

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        homeTableView.register(CusTableViewCell.nib, forCellReuseIdentifier: CusTableViewCell.identifier)

        setupTableView()

    

    func setupTableView() 

        let viewModel = HomeViewModel()
        homeTableView.delegate = viewModel
        homeTableView.dataSource = viewModel

        homeTableView.rowHeight = 100

        view.addSubview(homeTableView)

        // homeTableView.separatorStyle = .none

        homeTableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
        homeTableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0).isActive = true
        homeTableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 0).isActive = true
        homeTableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true

    


CusTableViewCell.swift

class CusTableViewCell: UITableViewCell 

    @IBOutlet weak var nameLabel: UILabel!

    static var nib:UINib 
        return UINib(nibName: identifier, bundle: nil)
    

    static var identifier: String 
        return String(describing: self)
    

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code

        nameLabel.text = "Something"
    

    override func setSelected(_ selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    


HomeViewModel.swift

extension HomeViewModel: UITableViewDataSource, UITableViewDelegate 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 2
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        if let cell = tableView.dequeueReusableCell(withIdentifier: CusTableViewCell.identifier, for: indexPath) as? CusTableViewCell 
            cell.backgroundColor = UIColor(red:0.17, green:0.73, blue:0.83, alpha:1.0)
            return cell
        
        return UITableViewCell()
    


【问题讨论】:

【参考方案1】:

问题与对viewModel的弱引用有关。

viewModel变量放入控制器类,如下:

class HomeViewController 

  var viewModel: HomeViewModel!
  ...

  func setupTableView() 
      self.viewModel = HomeViewModel()
      ...
  

【讨论】:

是的,你是对的,它是相关的,但是在我将 viewModel 变量更改为var viewModel: HomeViewModel! 之后,即使没有点击,单元格也会停止显示,但是当我尝试将委托和数据源扩展直接添加到 HomeViewController 并连接表数据源时并委托给自己,它工作正常吗? 但是fileprivate let viewModel = ProfileViewModel() 可以正常工作,谢谢

以上是关于单击tableView后隐藏xib的自定义UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

从外部 xib/nib 文件导入的自定义按钮不响应按钮单击

另一个 xib 中的自定义 xib 大小不正确

自定义 tableview 单元 xib 出口返回 nil

更改 uitableviewcell 中的自定义附件视图?

使用 xib 和 tableView 的多个视图

无法使用 .xib 文件在我的自定义单元格中添加任何内容?