'意外地发现没有'在UITableView中搜索

时间:2015-07-31 21:43:43

标签: ios swift uitableview uisearchbar

我最近尝试将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
}

7 个答案:

答案 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的子类,只需按照以下步骤操作。

  1. 右键单击您的项目名称,然后在中创建新文件... Project Navigator
  2. iOS->来源创建 Cocoa Touch Class
  3. 在选项对话框子类字段类型 UITableViewCell enter image description here
  4. 我相信你已经有了一个自定义XIB文件,如果没有,请检查同时创建XIB文件
  5. 确保在属性检查器
  6. 中输入您的XIB 标识符

    enter image description here

    1. viewDidLoad()函数中注册您的单元格类:

      let nibCell = UINib(nibName: "RideTableViewCell", bundle: nil) self.tableView.registerNib(nibPosts, forCellReuseIdentifier: "RideCell")

    2. cellForRowAtIndexPath中注册自定义单元格,如下所示:

      let cell: RideTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("RideCell", forIndexPath: indexPath) as! RideTableViewCell

    3. 可能性#2:也许在您创建自定义XIB时,您没有告诉它属于哪个类。要设置XIB类,请按照以下步骤操作。

      1. 点击 Project Navigator
      2. 中的 .xib 文件
      3. 转到您单元格的身份检查员,并确保RideTableViewCell在那里。
      4. enter image description here

        如果您有任何疑问,请发表评论。干杯!

答案 2 :(得分:3)

请检查您是否给出了正确的班级名称(RideCell),填写了适当的模块(您的目标),最后是故事板中的标识符。如果可以,请分享故事板tableView单元格的SS。

enter image description here

enter image description here

希望有所帮助

答案 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