TabBar应用程序,moreNavigationBar和带导航栏的nib

时间:2010-02-01 15:31:11

标签: iphone uinavigationcontroller uitabbarcontroller uitabbar

我有一个带有几个笔尖的TabBar应用程序,大多数都带有一个NavBar。除了tabBar的“更多”部分中的“视图”外,它的效果非常好。

正如预期的那样,它会将一个NavBar返回到“更多”列表,以及我放置在笔尖中的NavBar。

我试图从moreNavigationBar中删除视图控制器并将顶部控制器从我的nib的navBar中删除,但是我从某处获得了额外的视图:

- (void)viewDidLoad {    
    TestAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    UITabBarController *ctrl = appDelegate.rootController;

    UINavigationController *navCtrl = ctrl.moreNavigationController;

    [navCtrl popToRootViewControllerAnimated: NO];
    [navCtrl pushViewController: navController.topViewController animated: YES];
    navController = navCtrl;
 [super viewDidLoad];
}

我的AppDelegate:

@interface TestAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
 UITabBarController *rootController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *rootController;

MainWindow笔尖是带有TabBarController的基于Window的项目的笔尖,链接到我的app委托中的rootController。

其他的nib有一个view + navigationController,我有一个UITableViewController子类作为我的Root View Controller。

如果我可以让它工作,它仍然不能解决我的问题,因为我想允许用户将它放在tabBar中的任何位置,所以,我必须知道是否有导航栏。

所以,我的问题是,你怎么知道是否有一个navigationBar(在这种情况下,如果显示tabBar的navigationBar),如果是的话,如何让我的navigationController“成为”tabBar的navigationController? / p>

或者,如果您对如何解决此问题有另一个想法,我也将不胜感激:)

1 个答案:

答案 0 :(得分:1)

来自apple的建议是你有TabBar控制器包含导航控制器,而不是相反。我有一个或多或少像这样的设置,我有更多标签持有一个导航控制器,基本上是这样的:

@interface SomethingNavViewController : UIViewController {
    UIView* aview;
    UINavigationController *navigationController;
}
@property (nonatomic, retain) IBOutlet UIView *aview;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end

在NIB中,我在更多面板的视图中有一个单独的Nav控制器,我没有用导航控制器视图替换标签栏项目的视图,我刚刚在视图中添加了一个Nav控制器。 / p>

在我的实施文件中,我有:

- (void)viewDidLoad {
    [super viewDidLoad];
    [[self view] addSubview:[navigationController view]];
    SomeOtherController *aController = [[[SomeOtherController alloc ] initWithNibName:@"SomeOtherController" bundle:nil ] autorelease];
    aController.title = @"Artwalks";
        // lots of application logic here.
    [self.navigationController pushViewController:aController animated:YES];
    [self.navigationController setDelegate:self];
}

关于这一点的一个关键是我已经实现了navigationController的委托方法,当你只是插入导航控制器时这非常方便。我发现当我没有这样做时,我的观点没有得到viewDidAppear消息,所以我实现了协议并添加了这个方法:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([viewController respondsToSelector:@selector(viewDidAppear:)]) {
        [viewController viewDidAppear:animated];
    }
}

这解决了我各种挥之不去的问题。

无论如何,我希望这个答案能为您提供所需的细节。如果没有,请提供有关您的问题的更多详细信息。我不太确定是什么,但我从某个地方得到了额外的视图,但这听起来像我在找到这个解决方案之前遇到的事情。