如何从 UITableViewDelegate 的 didSelectRowtAtIndexPath 方法显示 UINavigationController?
Posted
技术标签:
【中文标题】如何从 UITableViewDelegate 的 didSelectRowtAtIndexPath 方法显示 UINavigationController?【英文标题】:How to display UINavigationController from didSelectRowtAtIndexPath method of UITableViewDelegate? 【发布时间】:2016-07-18 04:53:31 【问题描述】:当用户点击表格单元格时如何显示 UINavigationController?仅代码。
以下代码不起作用:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
guard let vm = (viewModel as? UICatalogVM)?.modelForRowAtIndexPath(indexPath) else
return
let vc = ActivityIndicatorVC(viewModel: vm)
let nc = UINavigationController(rootViewController: self)
nc.pushViewController(vc, animated: true)
相反,这样的代码可以工作,但它会以模态方式显示 VC,这不是我想做的。
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
guard let vm = (viewModel as? UICatalogVM)?.modelForRowAtIndexPath(indexPath) else
return
let vc = ActivityIndicatorVC(viewModel: vm)
self.showViewController(vc, sender: self)
【问题讨论】:
我认为您错过了将rootViewController
设置为新UINavigationController
的步骤,在您的情况下是nc
。然后设置nc = UINavigationController()
。但是,通常的做法是先将您的 tableViewController 嵌入导航控制器中,然后您可以推送新的 viewController
cod3rite 感谢提示,通常的做法是将 UITableViewController 嵌入 UINavigationController 中。忘记设置 rootViewController 是什么意思?上例中设置为self,self是一个UIViewController。
【参考方案1】:
如果您当前的视图控制器已经在导航控制器中,那么您可以直接这样做:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
guard let vm = (viewModel as? UICatalogVM)?.modelForRowAtIndexPath(indexPath) else
return
let vc = ActivityIndicatorVC(viewModel: vm)
navigationController.pushViewController(vc, animated: true)
否则,您必须在导航控制器出现之前将当前视图控制器添加到它的前面。
例如,如果您使用 Storyboard 并且您当前的视图控制器是初始视图控制器,那么您必须添加一个 UINavigationController 作为初始视图控制器,然后将您当前的视图控制器设置为该导航控制器的 rootViewController然后您可以使用
在didSelectRowAtIndexPath:
上轻松推送新的视图控制器
navigationController.pushViewController(vc, animated: true)
【讨论】:
以上是关于如何从 UITableViewDelegate 的 didSelectRowtAtIndexPath 方法显示 UINavigationController?的主要内容,如果未能解决你的问题,请参考以下文章
如何在许多子类中使用 UITableViewDelegate 子类化 UIViewController
UIViewController 和 UITableViewDelegate 之间的通信
未调用 UITableViewDelegate cellForRowAtIndexPath
如何从 UIView 推送 UIViewController