在标签栏控制器中从一个 ViewController 到另一个 ViewController ?

Posted

技术标签:

【中文标题】在标签栏控制器中从一个 ViewController 到另一个 ViewController ?【英文标题】:Segue from one ViewController to another ViewController inside a Tab Bar Controller? 【发布时间】:2015-10-12 22:20:27 【问题描述】:

在界面生成器中,我有一个UITabBarController,它被设置为初始视图控制器。从标签栏控制器,我已经链接了三个独立的 ViewController;两个UIViewController 和一个UITableViewController。我已将所有这三个视图都嵌入到 UINavigationController 中,因为这些视图中的每一个最终都会转向一个新视图。

Interface Builder

问题:

我现在想使用一个按钮将UIViewController 之一链接到UITableViewController 以连接到表格视图。这样我可以将信息(即func prepareForSegue())传递给表格视图。我想将标签栏控制器保留在底部,但是我不想通过视图顶部的UIBarButtonItem 从当前的UITableViewController 返回到以前的UIViewController;这就是底部标签栏的用途。

但是,每次我继续“显示”表格视图(它实际上是表格视图导航控制器的转场)时,表格视图顶部和底部的导航栏都会消失。有没有办法防止这种情况发生?

我也尝试将“显示”直接转到表格视图,在这种情况下,标签栏是可见的,但随后它会在视图顶部显示一个“返回”按钮以继续发送到发送 UIViewController .我对接受一个只隐藏后退按钮的解决方案犹豫不决,因为我觉得当我想从表格视图本身导航到详细视图时我会遇到问题,因为我会绕过UITableViewControllerUINavigationController

任何解决方案将不胜感激。我已经尝试解决这个问题好几个小时了,我正要通过我的电脑屏幕来解决这个问题。我还考虑过在按钮单击上使用tabBarController?.selectedIndex 以切换到表格视图,然后使用NSUserDefaults 传递信息,但这是不可能的,因为我将传递一个自定义对象,并且必须编码和解码每个自定义字段。

【问题讨论】:

【参考方案1】:

我使用 segue 来实现它,正如你所说,你仍将使用 UIViewControllerUINavigationController,这似乎有点混乱。所以我实际上认为selectedIndex 可能是最好的方法,因为一旦您更改为UITableViewController,您将位于正确的导航堆栈中。

不使用NSUserDefaults,为什么不直接从UIViewController 引用UITableView 本身,设置您想要的值,然后使用self.tabBarController.selectedIndex 切换到它。

因此,对于上面的场景,假设UITableViewContollrerUITabBarController 中的第三个视图,您将执行以下操作:

    通过在UITabBarController 中设置一些预定义的var,将您想要的任何内容传递给UITabBarController。例如,如果UITableViewController中有一个名为saveMeString,则在UIViewController中执行以下操作:

    let navController = self.tabBarController?.viewControllers![2] as! UINavigationController
    let tableViewController = navController.viewControllers.first as! JarListTableViewController
    tableViewController.saveMe = "Saved string here"
    

    使用以下方式切换到UITableViewController

    self.tabBarController?.selectedIndex = 2
    

唯一的问题是使用selectedIndex 不会执行过渡动画,但不确定您是否需要它。 This link could help if you do.

【讨论】:

谢谢这工作......有点。我不得不改变一件事。您不能投射 UINavigationController as! JarListTableViewController。而不是let tableViewController = navController as! JarListTableViewController,你必须说let tableViewController = navController.viewControllers[0] as! JarListTableViewController。就这样。如果你更新你的答案,我会投票并接受它。 糟糕,抱歉。我忘了添加那部分。实际上,我的做法与我在上面更正的方式略有不同。希望你没有在我的愚蠢错误上浪费太多时间! 无论哪种方式都可以,我只是更喜欢使用完整的单词而不是数字。 嗯没有意识到 .first 是数组的关键字...无论如何,再次感谢!

以上是关于在标签栏控制器中从一个 ViewController 到另一个 ViewController ?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift 3中从标签栏移动时重新加载页面?

如何在 iPhone 中从一个 Tabbarview 控制器切换到另一个 TabbarViewController?

如何在ios中从一个视图导航到另一个视图?

想在标签栏视图控制器中添加一个简单的导航栏

隐藏在标签栏控制器标签栏旁边的 iPhone 视图

与标签栏控制器和标签栏有点混淆