MTMultipleViewController
是一个容器视图控制器,它允许根据导航栏中的 UISegmentedControl
选择子视图。
它做了些很酷的事情
leftBarButtonItem
、rightBarButtonItem
等)都来自当前选定的子 UIViewController
navigationItem.title
属性MTMultipleViewController
使用了适当的容器视图控制器 API,所以所有相关的旋转、内存和视图生命周期消息都会自动传递给选定的子视图应该指出的是,通常情况下,HIGs 指定视图(例如,MTMultipleViewController
显示的)标题中的分段控件是为了在单一数据集中选择不同的筛选视图(例如,请参阅 Phone.app 中的“最近”标签,或官方 Twitter.app 中的“连接”标签)。这些筛选视图很容易通过单个 UITableViewController
子类来完成,如果您使用 MTMultipleViewController
来实现这种设计,那么您可能做错了。在光谱的另一端,使用 MTMultipleViewController
在两个或多个明显不同的视图控制器之间切换同样不是一个好主意;MTMultipleViewController
之所能发挥的地方在于这两个极端之间的灰色区域。在 MTMultipleViewController
内嵌入的视图所呈现的数据之间应该有一种自然且互补的关系;每个子视图中的数据应该彼此主题相似,以便用户理解,但又足够不同,需要单独的视图控制器。如果这描述了您的用例,那么 MTMultipleViewController
可能正是您需要的。
iOS 5.0 是最低版本;自那时以来的任何版本都受支持。需要 ARC(如果您需要这个项目不使用 ARC,请告诉我,我会为您修复;我只是还没有需要过)。
使用 MTMultipleViewController
很简单。初始化看起来与任何系统视图控制器非常相似
UIViewController *controllerOne = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
controllerOne.navigationItem.title = @"One";
controllerOne.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil];;
UIViewController *controllerTwo = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
controllerTwo.navigationItem.title = @"Two";
controllerTwo.navigationItem.prompt = @"Controller two's prompt";
MTMultipleViewController *multipleViewController = [[MTMultipleViewController alloc] initWithChildViewControllers:@[controllerOne, controllerTwo]];
/* add multipleViewController into your view controller hierarchy anywhere you'd like */
前面的代码会得到这样的一些东西
您可以有任意数量的子视图控制器,但我强烈建议不要超过三个(如果有左右栏按钮项,则为两个)。子视图控制器之间的转换不是动画的(除非是具有 prompt
的视图控制器),这听起来很弱,但实际上这正是您想要的。
请注意,上面添加的 UIBarButtonItem
和 prompt
仅属虚构,真实代码中绝对不会这样使用。上面仅为演示界面外观。
相关钩子也已经就绪,允许在 nib/storyboard 文件中放置 MTMultipleViewController
实例(尽管您仍然必须以编程方式插入子视图;正如所有非系统视图容器一样)。
欢迎贡献!Fork 这个仓库并提交一个 pull request(或者只需打开一个工单,我会看我能做什么)。