0

我有一个带有多个 nib 的 TabBar 应用程序,大多数带有 NavBar。它工作得很好,除了 tabBar 的“更多”部分内的“视图”。

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

我试图从 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 nib 是带有 TabBarController 的基于窗口的项目的 nib,链接到我的应用程序委托中的 rootController。

其他笔尖有一个视图 + 导航控制器,我有一个 UITableViewController 子类作为我的根视图控制器。

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

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

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

4

1 回答 1

1

Apple 的建议是让 TabBar 控制器包含导航控制器,而不是相反。我有一个或多或少这样的设置,我让更多选项卡包含一个导航控制器,基本上是这样的:

@interface SomethingNavViewController : UIViewController {
    UIView* 一个视图;
    UINavigationController *navigationController;
}
@property(非原子,保留)IBOutlet UIView *aview;
@property (nonatomic, 保留) IBOutlet UINavigationController *navigationController;

@结尾

在NIB中,我在更多面板的视图中有一个单独的导航控制器,我没有用导航控制器视图替换选项卡栏项目的视图,我只是在视图中添加了一个导航控制器。

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

- (void)viewDidLoad {
    [超级视图DidLoad];
    [[self view] addSubview:[navigationController view]];
    SomeOtherController *aController = [[[SomeOtherController alloc] initWithNibName:@"SomeOtherController" bundle:nil ] autorelease];
    aController.title = @"Artwalks";
        // 这里有很多应用程序逻辑。
    [self.navigationController pushViewController:aController Animation: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];
    }
}

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

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

于 2010-02-02T17:27:16.847 回答