我将自定义标签栏控制器实现为一组按钮,每个按钮都与它自己的视图控制器相关。我在此链接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];
但是,我认为这不行……应该有更好的方法,我想不出。因此,如果有人可以就如何纠正或改进这个导航系统给我建议,那就太好了。
非常感谢。