带有 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 视图,如您所愿。您有几个选择:
- 删除
didSelectRowAtIndexPath
的内容,并在 prepareForSegue
中以其他方式获取对 table 视图的引用。
- 通过将 segue 更改为源自视图控制器本身而不是 table 视图单元来更新故事板。这将使您能够在
didSelectRowAtIndexPath
方法中调用 performSegueWithIdentifier
。
我有 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 视图,如您所愿。您有几个选择:
- 删除
didSelectRowAtIndexPath
的内容,并在prepareForSegue
中以其他方式获取对 table 视图的引用。 - 通过将 segue 更改为源自视图控制器本身而不是 table 视图单元来更新故事板。这将使您能够在
didSelectRowAtIndexPath
方法中调用performSegueWithIdentifier
。