'unexpectedly found nil' 用于在 UITableView 中搜索
'unexpectedly found nil' for search in UITableView
我最近尝试将 UITableViewController
更改为 UIView
中的 UITableView
。我改回这个是因为我的 UISearchBar
遇到错误,因为当我点击一个键来搜索我的应用程序时会因错误而崩溃:
fatal error: unexpectedly found nil while unwrapping an Optional value
这一行:
var cell = tableView.dequeueReusableCellWithIdentifier("rideCell") as! RideCell
当我切换回 UITableViewController
时,这个错误消失了,一切都很好,但是我刚刚再次测试它,它再次给我这个错误。
有人有什么建议吗?它在正常的 table 视图中工作正常,只是当我去搜索时它崩溃了。标识符绝对正确。
谢谢!
编辑:
全功能:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell
var ride: Ride
if tableView == self.searchDisplayController?.searchResultsTableView {
ride = DataManager.sharedInstance.getRideByName(searchResults[indexPath.row].name)!
} else {
ride = DataManager.sharedInstance.rideAtLocation(indexPath.row)!
}
cell.rideNameLabel.text = ride.name
var dateSinceUpdate = NSDate().timeIntervalSinceDate(ride.updated!)
var secondsSinceUpdate = Int(dateSinceUpdate)
var timeSinceUpdate = printSecondsConvert(secondsSinceUpdate)
cell.updatedLabel.text = timeSinceUpdate
if ride.waitTime == "Closed" {
cell.waitTimeLabel.text = ride.waitTime!
cell.timeBackgroundView.backgroundColor = getColorFromNumber(80)
cell.waitTimeLabel.font = UIFont(name: "Avenir", size: 13)
} else {
cell.waitTimeLabel.text = "\(ride.waitTime!)m"
cell.timeBackgroundView.backgroundColor = getColorFromNumber(ride.waitTime!.toInt()!)
cell.waitTimeLabel.font = UIFont(name: "Avenir", size: 17)
}
AsyncImageLoader.sharedLoader().cancelLoadingURL(cell.rideImageView.imageURL)
cell.rideImageView.image = UIImage(named: "Unloaded")
cell.rideImageView.imageURL = NSURL(string: ride.rideImageSmall!)
return cell
}
请检查您是否提供了正确的 class 名称(RideCell),填写了正确的模块(您的目标),最后是故事板中的标识符。如果没问题,请分享您的故事板 tableView 单元格的 SS。
和
希望对您有所帮助
如果您没有使用 UITableViewController,请检查是否添加了以下扩展。
class XYZViewController: UIViewController, UITableViewDataSource, UITableViewDelegate,UISearchBarDelegate, UISearchDisplayDelegate, UISearchResultsUpdating
{
或勾选此 Tutorial。它可能会帮助您解决此错误。
请检查您的委托是否已在 viewDidLoad 中正确设置,并且您是否正在继承 UITableView 的委托方法和搜索功能,如下所示:
class YourClass: UIViewController, UITableViewDelegate, UITableViewDataSource {
func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
}
}
并对搜索栏委托和数据源执行相同的操作。更多关于 here.
它显示为 nil,因为没有 RideCell 类型的 UItableViewCell。您必须创建一个新的 RideCell.swift,它将成为 UITableViewCell 的子类,然后将其与 tableView 的单元格相关联,然后继续。
发现了一个非常简单的问题解决方案。不得不改变这个:
var cell = tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell
对此:
var cell = self.tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell
您在对话中看到 fatal error
条 nil
条消息的可能性有几种。
可能性 #1: 确保你有一个名为 RideTableViewCell.swift
的 UITableViewCell
的子class。
要创建 UITableViewCell 的子class,只需按照以下步骤操作即可。
- Right-Click 在您的项目名称上并创建 New File...
项目导航器
- 从iOS->源创建Cocoa触摸Class
- 在选项对话框子中class 字段类型UITableViewCell
- 我相信您已经有一个自定义 XIB 文件,如果没有,请检查同时创建 XIB 文件
- 确保在 Attribute Inspector
中输入 XIB 标识符
在 viewDidLoad()
函数中注册您的单元格 class,如下所示:
let nibCell = UINib(nibName: "RideTableViewCell", bundle: nil)
self.tableView.registerNib(nibPosts, forCellReuseIdentifier: "RideCell")
像这样在 cellForRowAtIndexPath
中注册您的自定义单元格:
let cell: RideTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("RideCell", forIndexPath: indexPath) as! RideTableViewCell
可能性 #2: 也许当您创建自定义 XIB 时,您没有告诉它 class 它属于哪个。要设置 XIB 的 class,请按照以下步骤操作。
- 在 Project Navigator
中单击您的 .xib 文件
- 转到您手机的 身份检查器 并确保
RideTableViewCell
在那里。
如有任何问题请评论。干杯!
确保您在下面的代码中填写了正确的参数。
private let cellReuseIdentifier = "MyCell"
tableView.registerNib(UINib(nibName: "MyCell", bundle: nil), forCellReuseIdentifier: cellReuseIdentifier)
我最近尝试将 UITableViewController
更改为 UIView
中的 UITableView
。我改回这个是因为我的 UISearchBar
遇到错误,因为当我点击一个键来搜索我的应用程序时会因错误而崩溃:
fatal error: unexpectedly found nil while unwrapping an Optional value
这一行:
var cell = tableView.dequeueReusableCellWithIdentifier("rideCell") as! RideCell
当我切换回 UITableViewController
时,这个错误消失了,一切都很好,但是我刚刚再次测试它,它再次给我这个错误。
有人有什么建议吗?它在正常的 table 视图中工作正常,只是当我去搜索时它崩溃了。标识符绝对正确。
谢谢!
编辑:
全功能:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell
var ride: Ride
if tableView == self.searchDisplayController?.searchResultsTableView {
ride = DataManager.sharedInstance.getRideByName(searchResults[indexPath.row].name)!
} else {
ride = DataManager.sharedInstance.rideAtLocation(indexPath.row)!
}
cell.rideNameLabel.text = ride.name
var dateSinceUpdate = NSDate().timeIntervalSinceDate(ride.updated!)
var secondsSinceUpdate = Int(dateSinceUpdate)
var timeSinceUpdate = printSecondsConvert(secondsSinceUpdate)
cell.updatedLabel.text = timeSinceUpdate
if ride.waitTime == "Closed" {
cell.waitTimeLabel.text = ride.waitTime!
cell.timeBackgroundView.backgroundColor = getColorFromNumber(80)
cell.waitTimeLabel.font = UIFont(name: "Avenir", size: 13)
} else {
cell.waitTimeLabel.text = "\(ride.waitTime!)m"
cell.timeBackgroundView.backgroundColor = getColorFromNumber(ride.waitTime!.toInt()!)
cell.waitTimeLabel.font = UIFont(name: "Avenir", size: 17)
}
AsyncImageLoader.sharedLoader().cancelLoadingURL(cell.rideImageView.imageURL)
cell.rideImageView.image = UIImage(named: "Unloaded")
cell.rideImageView.imageURL = NSURL(string: ride.rideImageSmall!)
return cell
}
请检查您是否提供了正确的 class 名称(RideCell),填写了正确的模块(您的目标),最后是故事板中的标识符。如果没问题,请分享您的故事板 tableView 单元格的 SS。
和
希望对您有所帮助
如果您没有使用 UITableViewController,请检查是否添加了以下扩展。
class XYZViewController: UIViewController, UITableViewDataSource, UITableViewDelegate,UISearchBarDelegate, UISearchDisplayDelegate, UISearchResultsUpdating
{
或勾选此 Tutorial。它可能会帮助您解决此错误。
请检查您的委托是否已在 viewDidLoad 中正确设置,并且您是否正在继承 UITableView 的委托方法和搜索功能,如下所示:
class YourClass: UIViewController, UITableViewDelegate, UITableViewDataSource {
func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
}
}
并对搜索栏委托和数据源执行相同的操作。更多关于 here.
它显示为 nil,因为没有 RideCell 类型的 UItableViewCell。您必须创建一个新的 RideCell.swift,它将成为 UITableViewCell 的子类,然后将其与 tableView 的单元格相关联,然后继续。
发现了一个非常简单的问题解决方案。不得不改变这个:
var cell = tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell
对此:
var cell = self.tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell
您在对话中看到 fatal error
条 nil
条消息的可能性有几种。
可能性 #1: 确保你有一个名为 RideTableViewCell.swift
的 UITableViewCell
的子class。
要创建 UITableViewCell 的子class,只需按照以下步骤操作即可。
- Right-Click 在您的项目名称上并创建 New File... 项目导航器
- 从iOS->源创建Cocoa触摸Class
- 在选项对话框子中class 字段类型UITableViewCell
- 我相信您已经有一个自定义 XIB 文件,如果没有,请检查同时创建 XIB 文件
- 确保在 Attribute Inspector 中输入 XIB 标识符
在
viewDidLoad()
函数中注册您的单元格 class,如下所示:let nibCell = UINib(nibName: "RideTableViewCell", bundle: nil) self.tableView.registerNib(nibPosts, forCellReuseIdentifier: "RideCell")
像这样在
cellForRowAtIndexPath
中注册您的自定义单元格:let cell: RideTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("RideCell", forIndexPath: indexPath) as! RideTableViewCell
可能性 #2: 也许当您创建自定义 XIB 时,您没有告诉它 class 它属于哪个。要设置 XIB 的 class,请按照以下步骤操作。
- 在 Project Navigator 中单击您的 .xib 文件
- 转到您手机的 身份检查器 并确保
RideTableViewCell
在那里。
如有任何问题请评论。干杯!
确保您在下面的代码中填写了正确的参数。
private let cellReuseIdentifier = "MyCell"
tableView.registerNib(UINib(nibName: "MyCell", bundle: nil), forCellReuseIdentifier: cellReuseIdentifier)