如何从 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

UITableViewDelegate 和 UITableViewDatasource 的区别

无法覆盖 UITableViewDataSource 和 UITableViewDelegate