Ios UITabBarController-子(选项卡)视图控制器的边界不正确且不一致

Ios UITabBarController-子(选项卡)视图控制器的边界不正确且不一致,ios,ios7,uitabbarcontroller,Ios,Ios7,Uitabbarcontroller,我有一个带有两个选项卡的UITabBarController。每个选项卡都是一个UITableViewController 当出现UITabBarController时,两个选项卡视图的边界都不正确。第一个选项卡正确位于导航栏下方,但在底部的选项卡栏下方延伸。第二个选项卡与此相反,从导航栏下方开始,但在底部的选项卡栏之前正确停止 我正在创建并演示TabBarController,如下所示: ActiveListTabBarViewController* listTabBarController

我有一个带有两个选项卡的
UITabBarController
。每个选项卡都是一个
UITableViewController

当出现
UITabBarController
时,两个选项卡视图的边界都不正确。第一个选项卡正确位于导航栏下方,但在底部的选项卡栏下方延伸。第二个选项卡与此相反,从导航栏下方开始,但在底部的选项卡栏之前正确停止

我正在创建并演示TabBarController,如下所示:

ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
_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]];
然后在tabbar控制器的
init
中,创建并添加子(选项卡)视图,如下所示:

ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
_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]];
我做错了什么

谢谢, 加文

更新:按照建议将以下方法添加到
基本视图控制器

- (UIRectEdge)edgesForExtendedLayout
{
    return UIRectEdgeNone;
}
第一个选项卡的行为已得到改进,并且位置正确,但第二个选项卡保持不变。目前情况如下:

ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
_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]];

有什么建议吗?
干杯。

尝试在视图控制器中实现此方法:

- (UIRectEdge) edgesForExtendedLayout
{
    return UIRectEdgeNone;
}
- (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;
}

问题是由我演示
UITabBarController

ActiveListTabBarViewController* listTabBarController = [[ActiveListTabBarViewController alloc] initWithListController:_listController];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:listTabBarController];
[self presentViewController:nc animated:YES completion:^(){}];
回到苹果的文档,我不确定这是否是一种有效的方式来展示
UITabBarController
。也就是说,将其显示为另一个视图控制器的子视图

不是。以下是一些片段,为我证实了这一点;从这一点,以及由此产生的变化来看,我假设如上所述呈现TabBarController是不正确的

发件人:

在创建选项卡栏界面之前,您需要决定打算如何创建 使用选项卡栏界面。因为它强加了一个包罗万象的 在您的数据组织中,您应该仅在这些特定的 方式:

  • 直接将其安装为窗口的根视图控制器
  • 将其作为拆分视图界面中的两个视图控制器之一安装。(仅限iPad)
  • 从另一个视图控制器以模式显示它
  • 从弹出窗口显示它。(仅限iPad)
发件人:

与其他视图控制器不同,选项卡栏界面不应 作为另一个视图控制器的子级安装

进一步澄清:

选项卡栏控制器是用于 将应用程序分为两种或两种以上不同的操作模式

导航控制器显示分层组织的数据 是UINavigationController类的一个实例。方法 此类支持管理基于堆栈的 内容查看控制器

我之所以将
UITabBarController
作为导航控制器的根视图,是因为我想要导航栏

这就是我现在如何在TabBarController的init中实现的:

- (UIRectEdge) edgesForExtendedLayout
{
    return UIRectEdgeNone;
}
- (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;
}
注意,我不需要做任何事情:

  • edgesForExtendedLayout
  • 自动调整滚动视图插图
  • 扩展布局包括不透明条

iOS 7默认值与导航栏和选项卡栏有关(与上面的原始屏幕截图不同,当
UITabBarController
显示错误时)。

有趣的是,这导致了第一个选项卡的正确边界;现在它是完全正确的,位于nag栏和tab栏之间。但第二个选项卡没有更改;它被放置在导航栏下方,但(仍然)没有正确地进入选项卡栏下方。谢谢。这帮了大忙。值得更多的选票!然而,我有时会遇到按钮消失的问题,因此我最终为每个选项卡创建了每个按钮的新实例,以避免将同一个按钮添加到两个不同的视图中。当你想到它时,也许一个视图不应该是另外两个视图的子视图。