【问题标题】:pushViewController does no actionpushViewController 没有动作
【发布时间】:2016-12-11 02:27:48
【问题描述】:

我有一个 tableview,当其中一个行被点击时,我想去另一个 vc。我的 didSelectRowAtIndexPath 函数如下。打印命令有效并显示右键单击的行。但是当我使用 self.navigationController?.pushViewController 时,它不会使用 playVideo storyBoardId 进入 vc。将其更改为 presentViewController 后,它可以工作。我的推送不起作用的代码有什么问题?

谢谢

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    print("clicked " + String(indexPath.row) )
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("playVideo") as! PlayVideoViewController

    vc.id = self.video[indexPath.row].id

    // Present View as Modal
    //presentViewController(vc as UIViewController, animated: true, completion: nil)
    // Push View
    //self.navigationController?.pushViewController(vc, animated: true)
}

【问题讨论】:

  • PlayVideoViewController 不是导航控制器的根目录,因此 pushViewController 方法不会运行。您需要通过转到情节提要添加导航控制器,选择 PlayVideoViewController,在顶部菜单中选择编辑器 -> 嵌入 -> 导航控制器。现在您的 PlayVideoViewController 将成为导航控制器的根,并且 pushViewController 应该可以正常工作。
  • @muazhud 我和你和 Bseaborn 说的一样。但它仍然无法正常工作
  • 这是我对同一stackoverflow.com/a/56199240/1371853的回答

标签: ios swift pushviewcontroller


【解决方案1】:
  • 这是因为您当前所在的视图控制器可能没有导航控制器。
  • 没有 UINavigationController 就无法推送视图控制器。
  • 如果您的要求是推送视图控制器,请执行以下步骤。

    1. 为当前视图控制器嵌入导航控制器。(打开故事板 -> 选择您的视图控制器 -> 选择“编辑器” -> “嵌入” -> UINavigationController)
    2. 现在你的代码

    self.navigationController?.pushViewController(vc, animated: true)

会正常工作。

【讨论】:

  • 我认为它只需要目的地的导航控制器。大错!感谢您的明确回答
  • @Bharath,如何以编程方式执行此操作?
  • @Shyam:为了以编程方式说明它,假设您在 FirstViewController 中并且想要导航到 SecondViewController 在这种情况下,首先您必须将 FirstVC.. 嵌入到导航控制器中,例如 (let navController = UINavigationController.init(rootViewController: FirstVC..)),那么你就可以展示这个导航控制器了。然后在 FirstVC 中你可以调用 (self.navigationController?.pushViewController(SecondVC, animated: true))。
  • @Bharath,谢谢。猜猜,它可能行不通,因为我正在开发一个仅限 iMessage 的应用程序。而且,它不是一个正确的UIViewController,而是一个孩子,这是一个限制。
  • 很好,我的情况下使用 wfk 编程,这是 nil je
【解决方案2】:

确保您的 ViewController 确实建立在 NavigationController 之上。试试强制换行:

self.navigationController!.pushViewController

如果它崩溃了,你就知道没有设置导航。或者您可以只查看您的故事板,但这是一种快速的讲述方式。

【讨论】:

  • 它崩溃了。在展开 Optional 值时意外发现 nil。但它有一个导航控制器。我不明白为什么它说 nil
  • 我不太确定您的设置。但是从情节提要中删除导航控制器,点击您想要嵌入到导航中的视图控制器。转到编辑器 -> 嵌入 -> 导航控制器
【解决方案3】:

我不知道你为什么要这样。我认为它不必要地复杂。

这应该由你的函数 didSelectRowAtIndexPath:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("playVideo", sender: tableView)
}

然后你可以在这个函数中指定尽可能多的segue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "playVideo") {
        let indexPath:NSIndexPath = tableView.indexPathForSelectedRow!
        let PlayVideoViewController = segue.destinationViewController as! PlayVideoViewController
        //you can pass parameters like project id
        detailVC.projectID = ids[indexPath.row]
    }
}

你的 segue 必须在界面生成器中这样命名:

【讨论】:

  • 我对 segue 很熟悉,但就我而言,使用 push 是更好的选择;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
相关资源
最近更新 更多