标签栏控制器应该如何集成到导航控制器工作流程中?

Posted

技术标签:

【中文标题】标签栏控制器应该如何集成到导航控制器工作流程中?【英文标题】:How should a tab bar controller be integrated into a navigation controller workflow? 【发布时间】:2015-02-20 16:06:32 【问题描述】:

我得到了一个具有以下工作流程的设计:

用户登录应用 成功登录后,用户会看到一个包含数据行的表格视图 单击数据行后,用户将被带到带有选项卡式界面的视图控制器。选项卡式界面中的每个视图控制器 深入了解表格视图中显示的数据的一个方面。 用户可以从任何选项卡中按下返回按钮并返回到 tableview。

根据这个描述,在我看来,应用程序需要一个导航控制器根视图控制器来登录和 tableview,然后在单击表行时,应用程序需要利用 tabbar 控制器来深入了解数据。

我似乎无法使用情节提要将 UITabBarController 添加到导航控制器。此外,我发现其他 SO 帖子提出了类似的问题,但提供的答案似乎都不是最新的,或者使用当前 (ios7/8) 最佳实践解决此工作流程。有没有办法完成这个工作流程?如果没有,我可以用简明的解释来通知设计师和利益相关者吗?

How do I add a tab bar controller to a navigation-controller-based application? Tab bar controller inside a navigation controller, or sharing a navigation root view

【问题讨论】:

【参考方案1】:

我检查了您的要求。

虽然 Apple Inc. 不建议将其用于常规用例,但

https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/TabBarControllers.html#//apple_ref/doc/uid/TP40011313-CH3-SW2

但可以通过以下步骤轻松实现建议的设计原则。

    在故事板中创建类似的设计,请注意导航控制器位于登录屏幕之前。

    实现以下列表方法,以编程方式通过列表视图调用特定选项卡。
 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"test" forIndexPath:indexPath];
    cell.textLabel.text = [NSString stringWithFormat:@"%ld", (long)[indexPath row]];
    return cell;

(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    UITabBarController *tbc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTabbedViewController"];
    tbc.selectedIndex= (long)[indexPath row];
    [self showViewController:tbc sender:self];

    如果列表大小是动态的,您也可以通过编程方式创建标签栏项。

https://24hrstech.wordpress.com/2012/08/19/create-tabbarcontroller-programmatically/

【讨论】:

【参考方案2】:

Apple 建议 UITabBarController 主要用作根视图控制器。

在您的情况下,我建议在普通UIViewController 的视图上使用UISegmentedControl 而不是UITabBarController。通过一些逻辑,您可以在建议的UIViewController 中显示不同的视图,对应于被按下的UISegmentedControl 的段。

此外,如果您使用导航控制器,您可以在导航栏中嵌入UISegmentedControl 作为标题。 (请参阅电话应用中的“最近”标签。

【讨论】:

【参考方案3】:

我为我目前正在开发的应用程序使用了类似的功能。在我的应用程序中,

    我在导航控制器中登录并注册,一旦登录/注册成功,它会转到另一个具有表格视图的导航控制器。

    点击表格中的“旅游”单元格后,我将被带到一个标签栏控制器,其中包含有关 4 个不同地点的不同详细信息的标签。在任何选项卡中,您都可以通过单击导航栏中的后退按钮返回成功登录后出现的主表格视图。

    如果这是您需要的,我已经按照上面的答案所示的“嵌入”标签栏控制器。它对我来说非常有效。我的应用程序处于纵向模式。我听说这会在横向模式下产生问题。我是初学者,在横向模式下我没有尝试过。

    在登录视图控制器后为表格视图嵌入一个新的导航控制器。我在我的应用程序中使用相同的。

【讨论】:

【参考方案4】:

这是你需要做的。

这里我使用按钮导航,因为我没有创建完整描述的视图,但不需要将按钮与表格视图控制器或标签栏绑定。

1.) 选择 V​​iew Controller,然后转到 EditorEmbed In>Navigation Controller

2.) 将 View Controller 与 Table View Controller 绑定。

3.) 为 segue 提供 identifire,以便您可以根据登录成功调用 perform segue。

4.) 为了使用 tabbar 的正确导航流程,您需要先将 tabbar 控制器与 View Controller 绑定,然后将导航控制器嵌入到 tabbar。 类似的方式你也可以将导航控制器嵌入到标签栏控制器,但它不是正确的流程。

5.) 最后,你的故事板看起来会像这样。

6.) 结果

希望它能帮助你解决问题。

【讨论】:

@propstm 如果有任何疑问,请告诉我。【参考方案5】:

在导航控制器中嵌入标签控制器并不是很困难,你可以通过将导航控制器设置为rootViewController,然后从你的tableview单元格开始到tabBarController,这是一个example您的工作流程。

【讨论】:

【参考方案6】:

你可以这样设计你的用户界面

将导航控制器设为初始视图控制器 第二个视图是您的登录屏幕 第三个视图是显示数据的表格视图 最后是标签栏控制器及其项目视图控制器

希望这会有所帮助....

【讨论】:

【参考方案7】:

虽然可行,但不建议在导航栏中嵌入标签栏。我违反了 Apple 的指导方针,用户习惯于将标签栏作为根控制器。

如果您只想在某些情况下显示标签栏,我建议您在导航控制器顶部以模态方式显示它。


来自Apple:

在创建标签栏界面之前,您需要确定您的意图 使用标签栏界面。因为它强加了一个总体 组织你的数据,你应该只在这些特定的 方式:

直接将其安装为窗口的根视图控制器。 安装为 拆分视图界面中的两个视图控制器之一。 (仅限 iPad) 从另一个视图控制器以模态方式呈现它。 从 弹出框。 (仅限 iPad)

在应用的主界面中安装标签栏界面 window 是迄今为止最常见的使用方式。 在这样的场景下, 标签栏界面提供了基本的组织原则 对于您的应用程序的数据,每个选项卡都会将用户引导到不同的部分 的应用程序。您可以单独使用标签栏控制器,也可以在 与其他视图控制器一起创建更多 复杂的接口。有关详细信息,请参阅组合视图 控制器接口。

如果一个非常 特定的需要使得这样做是值得的。例如,您可以 以模态方式显示标签栏控制器以编辑一些复杂的 具有几组不同选项的数据集。因为模态 视图填满整个或大部分屏幕(取决于设备), 标签栏的存在只会反映可用的选择 查看或编辑模态呈现的数据。避免使用标签栏 如果有更简单的设计方法可用,则采用这种方式。

【讨论】:

苹果在哪里这么说的?我以前听过这种推理方式,但是我从未见过 Apple 关于该主题的明确文档。【参考方案8】:

您无法从表格视图单元格中推送 TabBarController,因为“现在已弃用推送”。您可以在情节提要中按照以下步骤操作:

    获取导航控制器初始视图控制器。 添加 tableview 作为其根视图控制器。 然后将 TabBarController 添加到情节提要。 然后右键单击 tableView 单元格并将 tableview 单元格选择链接到 TabBarController 与“显示”。

【讨论】:

【参考方案9】:

你可以使用MHCustomTabBarController它是用Apples Custom Container ViewController API构建的,可以嵌套在你的导航控制器中

【讨论】:

以上是关于标签栏控制器应该如何集成到导航控制器工作流程中?的主要内容,如果未能解决你的问题,请参考以下文章

如何导航到嵌入在标签栏控制器中的视图控制器

标签栏控制器内的导航控制器不显示标题

如何让所有导航控制器在标签栏中扎根?

如何将导航控制器嵌入到标签栏控制器

从标签栏控制器跳回导航控制器 - swift 4

标签栏导航栏中的后退按钮