0

iOS5以降用のアプリを開発していますが、ストーリーボードやIBは使用していません。私はカスタムUITabBarControllerを作成しAppDelegateていて、それに1つだけで4つのビューコントローラーを入れてUINavigationControllerいます(理由はわかりません)。

その結果、最初のタブからのみ新しいVCをプッシュできる動作が発生します。これは、明らかに、UINavigationController呼び出されたnavController:にパックされています。

SGTabBarController *tabBarController = [[SGTabBarController alloc] init];

    SGHomeViewController* vc1 = [[SGHomeViewController alloc] init];
    SGChooseOSAgainViewController* vc3 = [[SGChooseOSAgainViewController alloc] init];
    SGSmsServicesViewController* vc4 = [[SGSmsServicesViewController alloc] init];
    SGSupportViewController *vc5 = [[SGSupportViewController alloc] init];
    navController = [[UINavigationController alloc] initWithRootViewController:vc1];

    NSArray* controllers = [NSArray arrayWithObjects:navController, vc3, vc4, vc5, nil];
    tabBarController.viewControllers = controllers;

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = tabBarController;
    [navController setNavigationBarHidden:YES animated:NO];
    [self.window makeKeyAndVisible];

何故ですか?UINavigationControllerタブごとに個別に作成する必要がありますか?このコードはAppleのドキュメントから取得しました。

4

4 に答える 4

2

タブごとに個別のUINavigationControllerを作成する必要があります

各タブでナビゲートする場合は、はい、navigationControllerに埋め込まれた各viewControllerを追加する必要があります。

于 2013-03-05T15:26:27.373 に答える
2

はい、できます。yourUITabBarController.m で次のようなコードを試してください。

- (void)viewDidLoad
{
    [super viewDidLoad];
        
    NSMutableArray* sectionViewControllers = nil;
    NSArray* controllers = [self controllers];
    UIViewController* controller = nil;
    
    for (controller in controllers)
    {
        if (sectionViewControllers == nil)
            sectionViewControllers = [NSMutableArray arrayWithCapacity:0];
        
        UINavigationController* navigationController = [[UINavigationController allocWithZone:[self zone]] initWithRootViewController:controller];
        
        navigationController.navigationBarHidden = YES;
        
        [sectionViewControllers addObject:navigationController];
        [navigationController release];
    }
    
    self.viewControllers = sectionViewControllers;
}

- (NSArray*)controllers
{
    if (!_controllers)
        _controllers = [NSArray arrayWithObjects:[self tabController1], [self tabController2], nil];
    return _controllers;
}

これは AppDelegate.m にあります:

self.window.rootViewController = self.yourUITabBarController;
于 2013-03-05T15:31:07.113 に答える
1

tabbarControllerがあるとします。これで、tabControllerに任意のviewControllerまたは任意のNavControllerを追加できます。NavControllerにはviewControllerを含めることができます。ただし、navControllerまたはviewControllerを使用する場所が混乱する可能性があります。ナビゲーションが不要な場所、つまり不要な場所でviewControllerを使用します。

これは、最初のビューにビューのみが含まれ、2番目のビューにナビゲーションコントローラーが含まれるコード例です。最初のビューで新しいビューをプッシュすることはできませんが、2番目のビューで新しいビューを簡単にプッシュできます。

-(void)addTabBarControllers
{
    UIViewController *viewController1, *viewController2;

    viewController1 = [[[HomeView alloc] initWithNibName:@"HomeView" bundle:nil] autorelease];
    viewController2 = [[[FloorPlanHome alloc] initWithNibName:@"FloorPlanHome" bundle:nil] autorelease];


    UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:viewController2];

    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, nav2, nil];

    [[self.tabBarController.tabBar.items objectAtIndex:0] setTitle:@"First View"];
    [[self.tabBarController.tabBar.items objectAtIndex:1] setTitle:@"Second View"];


    [[self.tabBarController.tabBar.items objectAtIndex:0] setImage:[UIImage imageNamed:@"first.png"]];
    [[self.tabBarController.tabBar.items objectAtIndex:1] setImage:[UIImage imageNamed:@"second.png"]];

    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
}

AppDelegateのdidFinishLaunchingWithOptionsからこのメソッドを呼び出します。ここで、HomeViewとFloorPlanViewは2つの異なるビューです。最初に、これらのビューとクラスファイルを追加する必要があります。

于 2013-03-05T15:33:54.817 に答える
0

ここで私の答えを参照してください:
UITabBarControllerの問題

if(!self.tabBarController)
    self.tabBarController = [[UITabBarController alloc] init];

self.tabBarController.delegate=self;

NSMutableArray *localcontrollerarray = [[NSMutableArray alloc] initWithCapacity:2];

UIViewController *viewController1 = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];

UINavigationController *navi1 = [[UINavigationController alloc] initWithRootViewController:viewController1];

[localcontrollerarray addObject:navi1];

UIViewController *viewController2 = [[ScanViewController alloc] initWithNibName:@"ScanViewController" bundle:nil];

UINavigationController *navi2 = [[UINavigationController alloc] initWithRootViewController:viewController2];

[localcontrollerarray addObject:navi2];

self.tabBarController.viewControllers = localcontrollerarray;

[self.window addSubview:self.tabBarController.view];
于 2013-03-05T15:33:49.427 に答える