-1

我将自定义标签栏控制器实现为一组按钮,每个按钮都与它自己的视图控制器相关。我在此链接http://idevrecipes.com/2011/01/04/how-does-the-twitter-iphone-app-implement-a-custom-tab-bar/上进行了指导以实现该行为。所以相关部分代码如下:

- (void) selectedItemAtIndex:(NSUInteger)itemIndex
{
// Get the right view controller
NSDictionary* data = [self.tabBarItems objectAtIndex:itemIndex];
UIViewController* viewController = [data objectForKey:@"viewController"];

// Remove the current view controller's view
UIView* currentView = [self.view viewWithTag:SELECTED_VIEW_CONTROLLER_TAG];
[currentView removeFromSuperview];


// Set the view controller's frame to account for the tab bar (+ 48)
viewController.view.frame = CGRectMake(0,48,self.view.bounds.size.width, self.view.bounds.size.height - 48);

// Se the tag so we can find it later
viewController.view.tag = SELECTED_VIEW_CONTROLLER_TAG;

// Add the new view controller's view
[self.view insertSubview:viewController.view belowSubview:self.tabBar];

//Keep track of current view controller
self.currentController = viewController;
}

到目前为止工作正常,我可以以与默认 TabBarViewController 类似的方式看到每个视图控制器。但是有一个要求,我需要从一个 tabBar 控制器内部以模态方式推送一个新的导航控制器(它应该占用所有应用程序框架)。

乍一看,我从一个选项卡控制器中尝试了以下代码:

DetailViewController *detailViewController = [[DetailViewController   alloc]init];
UINavigationController *navigationController = [[UINavigationController alloc]detailViewController];
[self presentModalViewController:navigationController animated:YES];

但是没有按预期工作,首先视图显示在 TabBar 下方,其次新视图没有考虑父视图框架,父视图框架应该是屏幕边界而不是标签栏。(0、48、360、412)。我的详细视图控制器正在从 nib 文件加载内容。

嗯,这很明显,因为 TabBar 控制器将每个视图插入到我的自定义 TabBar 下方。

[self presentModalViewController:navigationController animated:YES];

所以我尝试将它直接作为窗口子视图插入:

[[UIApplication sharedApplication].keyWindow addSubview:navigationController.view];

但是,我认为这不行……应该有更好的方法,我想不出。因此,如果有人可以就如何纠正或改进这个导航系统给我建议,那就太好了。

非常感谢。

4

1 回答 1

0

如果您正在为 iOS 5.0 及更高版本构建应用程序,您可以使用 childViewController。在您的自定义标签栏中,您可以拥有一个 containerView 和一个 tabView。

viewController 的视图被添加到 containerView 中。如果正确实现以下方法,所有必要的事件都会生成到随后添加的 viewController

- (void)addChildViewController:(UIViewController *)childController;
- (void)removeFromParentViewController;

可以在此处找到有关 viewController 包含的更多信息。

于 2013-03-05T15:44:53.960 回答