【问题标题】:Programmatically switch to navigation view on TableViewCell click in Swift在 Swift 中单击以编程方式切换到 TableViewCell 上的导航视图
【发布时间】:2017-07-19 10:12:05
【问题描述】:

我能够创建一个 iOS 应用程序,您可以在其中使用按钮在视图之间切换。这些视图有一个导航控制器,因此您可以返回。

不过我想稍微调整一下。

相反,我希望有一个没有导航控制器的单一视图。 然后,当单击表格视图中的单元格时,我想导航到具有导航控制器的下一个视图。

我可以在界面构建器中使用 segue 来实现这一点,但我不想通过构建器来管理它。这是因为当我对表格视图中单击的单元格进行了一些检查后,我只想转到下一个视图。

所以基本上我需要以编程方式更改视图。

这是我到目前为止所做的:

  • 我有一个普通的视图控制器。
  • 然后我在它旁边有一个导航控制器,之后链接到一个新的视图控制器。
  • 我给了这个 View 的 storyboard ID 为 presetController。

然后我的表格单元格 onclick 函数中有以下代码:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewController(withIdentifier: "presetController") as! PresetNavigationController
        self.present(nextViewController, animated:true, completion:nil)

现在这段代码将我带到下一个视图,但没有加载导航控制器。

如何使导航控制器链接到该视图?它已经通过编辑器选项卡链接嵌入到其中。

解释故事板的照片:

StoryBoard

【问题讨论】:

  • 你能贴出故事板的截图吗?
  • 添加了故事板图片

标签: ios swift uiviewcontroller uinavigationcontroller


【解决方案1】:

您需要将 View Controller 与 Navigation Controller 交换,然后执行以下代码:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewController(withIdentifier: "presetController") as! PresetNavigationController
        self.present(nextViewController, animated:true, completion:nil)

这将使您的导航栏后退按钮出现

【讨论】:

  • 它是右边的视图控制器,我不知道名字,因为它在打印屏幕上和你的代码上都不可见,但基本上你需要: NavigationController -> ViewController (with tablecell ) -> SecondViewController
  • 如何交换它们?
  • ViewController 是你的初始视图控制器吗?
  • 如果您看到我放入代码中的照片,我有 2 个视图控制器。第一个(左)是我的首字母。
  • 所以只需将 NavigationController 设为初始值,然后使用 segue 将 viewcontroller 设置为 rootviewcontroller,然后使用您拥有的代码
【解决方案2】:

如果您的链接导航控制器来自新控制器并且您正在打开 presntview 控制器,那么您将成为这样

  let nextViewController = storyBoard.instantiateViewController(withIdentifier: "presetController") as! PresetNavigationController

  let navController = UINavigationController(rootViewController: nextViewController)

  self.present(navController, animated:true, completion: nil)

【讨论】:

  • 您正在显示当前视图控制器,您只能将其关闭。如果你想返回按钮而不是你应该推送视图控制器并在 appdelegate 中制作导航控制器
【解决方案3】:

使用 ppinho 的建议,我将导航控制器作为入口点。

由于我不想在第一个视图中显示导航控制器,因此我使用以下代码将其隐藏:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // Hide the navigation bar on the this view controller
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // Show the navigation bar on other view controllers
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

然后我将新视图添加到导航中,如下所示:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewController(withIdentifier: "presetController") as! PresetViewController

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

【讨论】:

    【解决方案4】:

    在这里

    let nextScreen = storyboard?.instantiateViewController(withIdentifier: "nextScreenIdentifier") as! NextScreenControllerName
    self.navigationController?.pushViewController(nextScreen, animated: true)
    

    把它写在视图控制器的任何函数中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2010-09-27
      • 1970-01-01
      • 2017-05-01
      相关资源
      最近更新 更多