【问题标题】:UITableViewCell loaded from Xib always has Nil values从 Xib 加载的 UITableViewCell 始终具有 Nil 值
【发布时间】:2019-11-14 19:42:59
【问题描述】:

这是我的表格视图代码:

import UIKit
import Firebase

class HomeViewController: UITableViewController {

    @IBOutlet weak var labelCell: IconAndTitleTableViewCell!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.register(UINib(nibName: "IconAndTitleTableViewCell", bundle: nil), forCellReuseIdentifier: "iconAndLabelCell")

        labelCell.titleView.text = "Test"    
    }        
}

这是表格视图:

这是 Xib 文件:

但我不断收到错误:

线程 1:致命错误:在隐式展开可选值时意外发现 nil

尝试设置 labelCell 时。

它的字段为零。但为什么他们是零?我已经清楚地在桌子上注册了它。

【问题讨论】:

  • 您在代码中的哪一点出现错误?
  • labelCell.titleView.text = "测试"
  • 此时您还没有实例化 labelCell。您已将其注册为动态单元格以供重复使用,仅此而已。您似乎正在混淆动态和静态单元格。方法签名中有一条线索表明这是动态的 - forCellReuseIdentifier - 因为重用与静态单元格无关。如果您在 IB 而不是 XIB 中完成了单元格,这将起作用。

标签: ios swift uitableview xib


【解决方案1】:

您无法创建IBOutlet 的可重用元素,例如单元格。 你需要:

  1. 符合UITableViewDataSource委托方法并实现他所有需要的方法 例如:

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "", for: indexPath)
        return cell
    }
    
  2. 你可以在cellForRowAt方法中访问你的单元格

  3. 或者您可以使用方法 tableView.cellForRow(at: indexpath) 访问您的单元格

【讨论】:

    【解决方案2】:
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"iconAndLableCell" owner:self options:nil];
    labelCell = [topLevelObjects objectAtIndex:0];
    labelCell.titleView.text = @"Test";
    

    【讨论】:

      猜你喜欢
      • 2016-05-06
      • 1970-01-01
      • 2015-07-19
      • 2018-12-10
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2014-01-21
      相关资源
      最近更新 更多