带有 Segue 的 UITableView 和搜索栏

UITableView and Search Bar with Segue

我有 2 个数组。一种用于所有车辆,另一种用于过滤车辆。 filteredVehicles 由搜索栏动态生成,效果很好。但是我无法为下一个场景进行动态转场。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        self.performSegueWithIdentifier("DisplayViewSegue", sender: tableView)
    }

// In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "DisplayViewSegue" {
            let nextScene  =  segue.destinationViewController as! DisplayViewController


            if sender as! UITableView == self.searchDisplayController!.searchResultsTableView {
                let indexPath = self.searchDisplayController!.searchResultsTableView.indexPathForSelectedRow()!
                let selectedVehicle = self.filteredVehicles[indexPath.row]
                nextScene.currentVehicle = selectedVehicle
            } else {
                let indexPath = self.tableView.indexPathForSelectedRow()!
                let selectedVehicle = self.vehicles[indexPath.row]
                nextScene.currentVehicle = selectedVehicle
            }


        }
    }

这些是我关联的方法。当我单击任何 table 列表对象时,App 正在中断并出现此类错误:

Could not cast value of type 'UITableViewCell' (0x10757f9f0) to 'UITableView' (0x10757a810). (lldb)

看起来发件人是您按下的 table 视图单元格,因此您不应在此处进行强制转换。 (通常最好避免使用 as!)

我建议将选择车辆的逻辑放在 didSelectRowAtIndexPath 中。假设您有一个名为 Vehicle 的类型,类似的东西可以工作:

var selectedVehicle: Vehicle?
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if tableView == searchDisplayController?.searchResultsTableView {
        selectedVehicle = filteredVehicles[indexPath.row]
    } else {
        selectedVehicle = vehicles[indexPath.row]
    }
    self.performSegueWithIdentifier("DisplayViewSegue", sender: tableView)
}

这会简化您的 prepareForSegue 实施

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "DisplayViewSegue" {
        if let nextScene = segue.destinationViewController as? DisplayViewController {
            nextScene.currentVehicle = selectedVehicle
        }
    }
}

我相信您已经在情节提要中设置了从 table 视图单元格到下一个场景的转场。通过这样做,你的 segue 会自动执行,你不必调用 self.performSegueWithIdentifier("DisplayViewSegue", sender: tableView)

当然,问题是发件人是 table 视图单元格,而不是 table 视图,如您所愿。您有几个选择:

  1. 删除 didSelectRowAtIndexPath 的内容,并在 prepareForSegue 中以其他方式获取对 table 视图的引用。
  2. 通过将 segue 更改为源自视图控制器本身而不是 table 视图单元来更新故事板。这将使您能够在 didSelectRowAtIndexPath 方法中调用 performSegueWithIdentifier