ios – Xcode 6 – Swift – 带导航的自定义标签栏

我正在尝试使用 Swift / XCode 6.2在选项卡栏中创建带有导航元素的选项卡式应用程序,如下图(红色栏)所示.基本上,中间的这三个图标将引导用户到不同的视图控制器.其他两个图标将基于上下文.例如,在表格视图页面上,您将看到菜单图标并添加新图标,如图所示.但是,单击一行会将菜单图标更改为后退图标,将添加图标更改为其他内容.

这是一般的想法,但我很难实现甚至接近这个的东西.第一个问题是每当我在一个标签栏控制器中嵌入一个视图时,我都无法将标签栏移动到顶部.但是,当我在视图控制器中创建自定义UITabView时,控制单击并将选项卡栏项拖动到另一个视图不会创建segue.我甚至没有开始解决在栏内导航元素的问题.

我想我要问的只是为了解决这个问题的路线.我假设我不能使用标签栏控制器或导航控制器,因为我似乎不能自定义它们.那么自定义标签栏和导航栏,然后以编程方式实现segue和按钮更改?

谢谢.

解决方法

我将尝试从架构角度指导您(因此您将在下面找不到太多代码).

使用UITabBarController

为了达到你的建议,你是对的,你不能马上使用UITabBarController,有几个原因,最直接的一个是它们总是在底部,你想要它在顶部(检查Apple’s docs).好消息是,你可能不需要它!

注意:如果您仍想使用UITabBarController,无论出于何种原因,请参阅@ Matt的answer.

使用UINavigationController

您可以使用UINavigationController来解决此任务,因为可以自定义UINavigationController的UINavigationBar.有多种方法可以组织视图的层次结构来实现您的建议,但让我详细说明一个选项:

>要自定义UINavigationBar以添加按钮,您只需设置其navigationItem的标题视图:

// Assuming viewWithTopButtons is a view containing the 3 top buttons
self.navigationItem.titleView = viewWithTopButtons

>要在UINavigationController上添加汉堡菜单功能,您可以找到关于如何操作的several posts以及您可以使用的无限框架.请查看其他SO Question获取更详细的答案(例如MMDrawerController,ECSlidingViewController,提及一对夫妇).
>关于组织视图层次结构,它实际上取决于当用户点击其中一个主要顶部按钮时,它将始终转到新部分中的第一个视图控制器,或者是否要将他带回到最后一个视图中.他所在的部分.

3.1切换部分显示新部分的第一个视图

您的应用程序的UIWindow将在层次结构之上具有单个UINavigationController.然后,在点击时,3个顶部按钮中的每一个都将更改UINavigationController的根视图控制器.

然后,当用户更改部分时,通过将新的部分视图控制器设置为UINavigationController根视图控制器来丢弃当前导航层次结构.

self.navigationController = [sectionFirstViewController]

3.2切换部分显示新部分中最后显示的视图

这将需要上面稍微修改过的版本,其中您的每个部分都有自己的UINavigationController,因此您可以始终保持每个部分的导航层次结构.

然后,当用户点击其中一个顶部按钮切换部分,而不是如前所述进行更改时,您将UIWindowroot视图控制器更改为新部分的UINavigationController.

window.rootViewController = sectionNavigationController

使用自定义实现

当然,最后也是非常有效的选择是您自己实现自己的组件以满足您的要求.这可能是需要付出最大努力以换取最高可定制性的选项.

对于经验不足的开发人员,绝对不建议选择此选项.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...