我最近尝试将UITableViewController
更改为UITableView
内的UIView
。我改回了这个,因为我遇到了UISearchBar
的错误,因为当我点击一个键来搜索我的应用时会因错误而崩溃:
fatal error: unexpectedly found nil while unwrapping an Optional value
在这一行:
var cell = tableView.dequeueReusableCellWithIdentifier("rideCell") as! RideCell
当我切换回UITableViewController
时,这个错误就消失了,一切都很好,但是我只是再次测试它,它再次给了我这个错误。
有人有什么建议吗?它适用于普通的表视图,就在我进行搜索时它会崩溃。标识符绝对正确。
谢谢!
修改
全功能:
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
}
答案 0 :(得分:13)
发现了一个非常简单的问题解决方案。不得不改变这个:
var cell = tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell
到此:
var cell = self.tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell
答案 1 :(得分:7)
您可以在对话框中看到 fatal error
的nil
消息。
可能性#1:确保您的UITableViewCell
子类名为RideTableViewCell.swift
。
要创建UITableViewCell的子类,只需按照以下步骤操作。
在viewDidLoad()
函数中注册您的单元格类:
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时,您没有告诉它属于哪个类。要设置XIB类,请按照以下步骤操作。
答案 2 :(得分:3)
答案 3 :(得分:1)
如果您没有使用UITableViewController,请检查是否添加了以下扩展名。
class XYZViewController: UIViewController, UITableViewDataSource, UITableViewDelegate,UISearchBarDelegate, UISearchDisplayDelegate, UISearchResultsUpdating
{
或检查此Tutorial。它可能会帮助您解决此错误。
答案 4 :(得分:1)
请检查您的委托是否已在viewDidLoad中正确设置,并且您正在继承UITableView的委托方法和搜索函数,如下所示:
class YourClass: UIViewController, UITableViewDelegate, UITableViewDataSource {
func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
}
}
并对搜索栏代理和数据源执行相同操作。更多关于here。
答案 5 :(得分:1)
它显示为nil,因为没有类型为RideCell的UItableViewCell。您必须创建一个新的RideCell.swift,它将是UITableViewCell的子类,然后将其与tableView的单元格相关联,然后继续。
答案 6 :(得分:0)
确保在下面的代码中填写正确的参数。
div#myLight