在 Swift 中单击以编程方式切换到 TableViewCell 上的导航视图

Posted

技术标签:

【中文标题】在 Swift 中单击以编程方式切换到 TableViewCell 上的导航视图【英文标题】:Programmatically switch to navigation view on TableViewCell click in Swift 【发布时间】: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

【问题讨论】:

你能贴出故事板的截图吗? 添加了故事板图片 【参考方案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)

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

【讨论】:

以上是关于在 Swift 中单击以编程方式切换到 TableViewCell 上的导航视图的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在 Swift 中的选项卡之间切换

在 Swift 中以编程方式切换视图

如何以编程方式快速切换到暗模式

当用户以编程方式单击swift ios中的删除按钮时,如何将光标从一个文本字段自动移动到另一个文本字段?

你能以编程方式在iOS 8(w / Swift)中切换“请勿打扰”模式吗?

Swift:以编程方式在 UICollectionViewCell 中的 IndexPath 中的多个 UIButton,下一个 addTarget 不单击