选中表格单元格后,如何以Show Detail样式打开带对应标题的导航控制器?
先解决你最初「选中单元格无反应」的问题
你的第一个版本代码里,tableView(_:didSelectRowAt:)只做了打印操作,完全没触发页面跳转的逻辑;而且prepareForSegue的写法也有致命问题——你在这里调用dequeueReusableCell拿到的是一个全新的空单元格,根本不是用户选中的那个,自然没法正确传递标题内容。
如果想用Segue实现跳转,正确的做法是这样:
- 在故事板里,把列表单元格和目标导航控制器(或详情控制器)拖出Segue,设置identifier为
customerDetails,选好你需要的样式。 - 修改
didSelectRowAt,在里面触发Segue:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { performSegue(withIdentifier: "customerDetails", sender: indexPath) }
- 修正
prepareForSegue,通过sender拿到选中的indexPath,直接从数据源取数据,而非新建单元格:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "customerDetails" { guard let indexPath = sender as? IndexPath, let destinationNav = segue.destination as? UINavigationController, let detailVC = destinationNav.topViewController else { return } let item = feedItems[indexPath.row] as! StockModel let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-") detailVC.navigationItem.title = titleStr } }
再解决你现在的需求:以「Show Detail」样式呈现(全屏覆盖且无法返回)
你现在用pushViewController是导航栈的推入逻辑,会自带返回按钮。要实现全屏覆盖、无返回入口的效果,需要用模态呈现,并设置对应的模态样式:
修改你的didSelectRowAt代码如下:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // 直接从数据源拿数据生成标题,没必要操作单元格 let item = feedItems[indexPath.row] as! StockModel let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-") // 获取详情控制器 let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let detailController = storyboard.instantiateViewController(withIdentifier: "detailController") as? YourDetailViewControllerClass else { return } detailController.title = titleStr // 设置全屏模态样式,这样会完全覆盖原控制器且无默认返回按钮 detailController.modalPresentationStyle = .fullScreen // 如果详情页需要导航栏,就把它包裹在导航控制器里再呈现 // let navController = UINavigationController(rootViewController: detailController) // navController.modalPresentationStyle = .fullScreen // present(navController, animated: true) // 执行模态呈现 present(detailController, animated: true) }
注意点:
- 设置
.fullScreen后,详情页没有默认返回入口,如果你需要退出功能,得自己在详情页加关闭按钮,点击时调用dismiss(animated: true)。 - 如果详情页需要显示导航栏,一定要把它包裹在
UINavigationController里再呈现,否则设置的title不会显示出来。
内容的提问来源于stack exchange,提问作者user11349745
相关产品推荐
相关产品推荐

