我有UITabBarController
个标签。每个标签都是UITableViewController
。
当UITabBarController
出现时,两个标签视图都有不正确的边界。第一个选项卡正确位于导航栏下方,但延伸到底部的选项卡栏下方。第二个标签是另一种方式,从导航栏下方开始,但在底部的标签栏之前正确停止。
我正在创建和呈现TabBarController,如下所示:
ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
然后在TabBarController的init
中,创建并添加子(tab)视图,如下所示:
_todoListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsToDo]];
_todoListViewController.delegate = self;
_todoListViewController.title = @"To Do";
_completedListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsDone]];
_completedListViewController.delegate = self;
_completedListViewController.title = @"Completed";
[self setViewControllers:@[_todoListViewController, _completedListViewController]];
我做错了什么?
谢谢, 加文
更新:根据建议将以下方法添加到BasicTableViewController
:
- (UIRectEdge)edgesForExtendedLayout
{
return UIRectEdgeNone;
}
第一个选项卡的行为已得到改进并且位置正确,但第二个选项卡保持不变。情况如下:
有什么建议吗? 欢呼声。
答案 0 :(得分:3)
问题是由于我呈现 UITabBarController
ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
回到Apple的文档,我不确定这是否是提出UITabBarController
的有效方式。也就是说,将其呈现为另一个视图控制器的子节点。
不是。以下是为我确认的一些片段;从这一点,以及由此产生的变化,我假设在上面提供一个TabBarController是不正确的。
在创建标签栏界面之前,您需要确定自己的意图 使用标签栏界面。因为它强加了一个总体 对您的数据进行组织,您应该只使用这些特定的数据 方法:
- 直接将其安装为窗口的根视图控制器。
- 在拆分视图界面中将其安装为两个视图控制器之一。 (仅限iPad)
- 从另一个视图控制器以模态方式显示它。
- 从弹出窗口显示它。 (仅限iPad)
与其他视图控制器不同,标签栏界面永远不应该是 作为另一个视图控制器的子项安装。
进一步澄清:
标签栏控制器是您使用的容器视图控制器 将您的应用划分为两种或更多种不同的操作模式。
导航控制器显示按层次结构组织的数据 并且是UINavigationController类的一个实例。的方法 此类为管理基于堆栈的集合提供支持 内容查看控制器。
我将UITabBarController
作为导航控制器的根视图呈现的原因是我想要导航栏......
这就是我现在在TabBarController的初始化中实现的目的:
- (id)initWithListController:(BasicListController *)controller
{
self = [super init];
if (self) {
_controller = controller;
_todoListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsToDo]];
_todoListViewController.delegate = self;
_todoListViewController.title = @"To Do";
_completedListViewController = [[BasicTableViewController alloc] initWithList:[_controller itemsDone]];
_completedListViewController.delegate = self;
_completedListViewController.title = @"Completed";
UINavigationController* ncTodo = [[UINavigationController alloc] initWithRootViewController:_todoListViewController];
UINavigationController* ncCompleted = [[UINavigationController alloc] initWithRootViewController:_completedListViewController];
[self setViewControllers:@[ncTodo, ncCompleted]];
UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(doneTap:)];
_todoListViewController.navigationItem.leftBarButtonItem = doneButton;
_completedListViewController.navigationItem.leftBarButtonItem = doneButton;
}
return self;
}
注意,我没有做任何事情:
iOS 7的默认设置遵循导航栏和标签栏(与上面的原始屏幕截图不同,当UITabBarController
显示不正确时)。
答案 1 :(得分:1)
尝试在视图控制器中实现此方法:
- (UIRectEdge) edgesForExtendedLayout
{
return UIRectEdgeNone;
}