致命错误:在 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意外发现为零