致命错误:在 UITableViewCell 中展开可选值时意外发现 nil

Posted

技术标签:

【中文标题】致命错误:在 UITableViewCell 中展开可选值时意外发现 nil【英文标题】:fatal error: unexpectedly found nil while unwrapping an Optional value in UITableViewCell 【发布时间】:2017-03-02 09:13:14 【问题描述】:

here 提出了类似的问题,但这并不能解决我的问题。我在ViewController 中添加了tableView。使用它的 dataSource 和 Delegate 扩展了该类,并为其添加了所需的方法。然后我在此表中创建了一个原型单元格(不是单独的 .xib)并为该 TableViewCell 创建了一个类并收集了@IBOutlet:

    @IBOutlet weak var titleOfAccount: UILabel!
    @IBOutlet weak var lastModified: UILabel!

    @IBOutlet weak var accountImage: UIImageView!
    @IBOutlet weak var cellView: UIView!

然后在cellForRowAt的table view方法我写的时候

cell.titleOfAccount.text = "Hello World"
cell.lastModified.text = "Last Modified: 21 May 2017"

并运行因此错误而崩溃的代码。

致命错误:在展开可选值时意外发现 nil

在这里和那里搜索后我做了什么我回到tableViewCell类并将!更改为?并将cellForRowAt中的代码更新为:

 cell.titleOfAccount?.text = "Hello World"
 cell.lastModified?.text = "Last Modified: 21 May 2017"

现在,当我运行程序时,它运行成功,但tableView 中没有单元格出现,我也实现了该方法:

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

这是我的cellForRowAt 方法的完整代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell: AccountsTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! AccountsTableViewCell

        cell.backgroundColor = UIColor.clear
        cell.clipsToBounds = true

        cell.cellView.layer.shadowColor = UIColor.black.cgColor
        cell.cellView.layer.shadowOpacity = 1
        cell.cellView.layer.shadowOffset = CGSize.zero
        cell.cellView.layer.shadowRadius = 10

        cell.titleOfAccount.text = "Hello World"
        cell.lastModified.text = "Last Modified: 21 May 2017"
        cell.accountImage.image = UIImage(named: "fb")

        return cell
    

附:我还在viewDidLoad 中添加了self.tableView.register(AccountsTableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)

【问题讨论】:

让 cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath) as! AccountsTableViewCell 不,还是同样的错误! 你如何声明reusableidentifier?? Interface Builder 中自定义单元格的类是否设置为AccountsTableViewCell?如果您使用故事板,请不要注册单元格。 删除以编程方式注册类的行 【参考方案1】:

从您的viewDidLoad() 中删除以下行(代码),因为您已经从故事板连接了您的单元。

self.tableView.register(AccountsTableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)

还为身份检查器共享快照(属性检查器的左侧)。

【讨论】:

是的!我完全忘记了这个......#SwiftBeginners 来自 swfit 5,也有同样的问题。在界面生成器中注册时删除注册,有帮助。谢谢。 #SwiftBeginners【参考方案2】:

我想你可以通过修改 ViewController 中的代码来解决这个问题。

在下面使用

self.tableView.register(UINib(nibName: "AccountsTableViewCell", bundle: nil), forCellReuseIdentifier: cellReuseIdentifier)

而不是

self.tableView.register(AccountsTableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)

【讨论】:

【参考方案3】:

第 1 步:- 创建 UITableView 扩展类

//MARK: - UItableView Extension
extension UITableViewCell 
// Not using static as it wont be possible to override to provide custom storyboardID then
class var storyboardID : String 
    return "\(self)"
  

static func registerCellXib(with tableview: UITableView)
    let nib = UINib(nibName: self.storyboardID, bundle: nil)
    tableview.register(nib, forCellReuseIdentifier: self.storyboardID)
  

第 2 步:- 在 ViewDidLoad 方法中注册单元格

AudioTableViewCell.registerCellXib(with: audioListTableView)

这里AudioTableViewCell是tableviewCell,audioListTableView是Tableview

第 3 步:- 在 CellForRowAt 索引方法中

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: AudioTableViewCell.storyboardID, for: indexPath) as! AudioTableViewCell
    cell.audioFileName.text = "Audio \(indexPath.row + 1)"
    
    return cell
 

【讨论】:

【参考方案4】:

试试这个

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  
          let cell = tableView.dequeueReusableCell(withIdentifier: "yourcellidentifier", for: indexPath) as! AccountsTableViewCell
          // add your code
    

【讨论】:

不一样:fatal error: unexpectedly found nil while unwrapping an Optional value 用故事板检查你的单元格标识符,请它应该与“yourcellidentifier”相同 刚刚检查两端是否相同accountCell

以上是关于致命错误:在 UITableViewCell 中展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

Swift UITableViewCell detailTextLabel.text 抛出错误“致命错误:无法打开 Optional.None”

reloadData() 致命错误:在展开可选值时意外发现 nil

致命错误:在展开可选值时意外发现 nil - 当 UITextField 被点击时

自定义UITableViewCell中的UITextField意外发现为零

无法在 Swift 中展开和折叠 TableViewCell

在uitableview swift4中展开和折叠多级部分