带有Segue的UITableView和搜索栏

时间:2015-07-10 14:44:22

标签: ios swift xcode6 uistoryboardsegue

我有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
            }


        }
    }

这些是与我相关的方法。当我点击任何表列表对象时,App正在进行代理并出现此类错误:

  

无法转换类型' UITableViewCell' (0x10757f9f0)​​到   '的UITableView' (0x10757a810)。 (LLDB)

2 个答案:

答案 0 :(得分:1)

我相信你已经在故事板中从表格视图单元格到下一个场景中设置了一个segue。通过这样做,您的segue会自动执行,您无需拨打self.performSegueWithIdentifier("DisplayViewSegue", sender: tableView)

问题当然是发件人是表格视图单元格而不是表格视图,正如您所希望的那样。你有几个选择:

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

答案 1 :(得分:0)

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

我建议在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
        }
    }
}