1

5 つのビュー コントローラーを含むカスタム UITabBarController を持つアプリがあります。これらの各View Controller内で、他のView Controllerにアクセスできます。理想的には、View Controller がタブバーから直接発生するかどうかに関係なく、カスタム UITabBarController を各 ViewController に表示したいと考えています。

これは、元の 5 つのビュー コントローラーのそれぞれでナビゲーション コントローラーを使用して実現できると思いますが、カスタムの UITabBarController を各ビュー コントローラーに追加する方法はありますか? 私は私のviewDidLoad方法で次の方法でこれをやろうとしました:

AppDelegate *appDelegate = [(AppDelegate *)[UIApplication sharedApplication] delegate];
tabbarController = appDelegate.tabBarController;

tabbarController.view.frame = CGRectMake(0, 0, 320, 480);
[self.view addSubview:tabbarController.view];

しかし、コードを実行すると、アプリ デリゲートで bad_access が発生します。

何かご意見は?

4

2 に答える 2

2

あなたが正しく述べたように、各タブのルートコントローラーとして'UINavigationController'を使用すると、あなたがやろうとしていることを達成できます。

ナビゲーションコントローラを使用してタブバーを簡単に設定する方法の例を次に示します。

- (void)setupTabBar {

    // Create nav-controller for local use
    UINavigationController *localNavController;

    // New tabbar controller and array to contain the view controllers
    UITabBarController * theTabBarController = [[UITabBarController alloc] init];

    NSMutableArray *localViewControllersArray = [[NSMutableArray alloc] initWithCapacity:4];


    /*--------------------------------------------------------------------
     * Setup the view controllers for the different tabs
     *-------------------------------------------------------------------*/

    // Root view controller for Tab 1
    UIViewController *vc;

    vc = [[ViewController1 alloc] initWithNibName:@"ViewController1" bundle:nil];
    localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
    localNavController.tabBarItem.image = [UIImage imageNamed:@"image.png"];
    localNavController.tabBarItem.title = @"Tab1";

    // Add navigation controller to the local vc array (1 of 4)
    [localViewControllersArray addObject:localNavController];


    // Root view controller for Tab 2
    vc = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
    localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
    localNavController.tabBarItem.image = [UIImage imageNamed:@"image.png"];
    localNavController.tabBarItem.title = @"Tab2";

    // Add navigation controller to the local vc array (2 of 4)
    [localViewControllersArray addObject:localNavController];


    // Root view controller for Tab 3
    vc = [[ViewController3 alloc] initWithNibName:@"ViewController3" bundle:nil];
    localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
    localNavController.tabBarItem.image = [UIImage imageNamed:@"image.png"];
    localNavController.tabBarItem.title = @"Tab3";

    // Add navigation controller to the local vc array (3 of 4)
    [localViewControllersArray addObject:localNavController];


    // Root view controller for Tab 4
    vc = [[ViewController4 alloc] initWithNibName:@"ViewController4" bundle:nil];
    localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
    localNavController.tabBarItem.image = [UIImage imageNamed:@"image.png"];
    localNavController.tabBarItem.title = @"Tab4";

    // Add navigation controller to the local vc array (4 of 4)
    [localViewControllersArray addObject:localNavController];


    // Point the tab bar controllers view controller array to the array
    // of view controllers we just populated
    theTabBarController.viewControllers = localViewControllersArray;

    self.tabBarController = theTabBarController;

    [self.window setRootViewController:self.tabBarController];

    ...
}

お役に立てれば :)

于 2012-04-05T14:37:06.583 に答える
1

AppDelegateには1つのTabBarControllerが必要です。このTabBarControllerは、ViewControllerの配列(tabBarController.viewControllers)を保持します。これらのViewControllerはUINavigationControllerである必要があります。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UINavigationController* navController1 = [[UINavigationController alloc] initWithRootViewController:firstOfYourControllers;
    UINavigationController* navController2 = [[UINavigationController alloc] initWithRootViewController:sencondOfYourViewControllers;
    UINavigationController* navController3 = [[UINavigationController alloc] initWithRootViewController:andSoOn;
    UINavigationController* navController4 = [[UINavigationController alloc] initWithRootViewController:andSoOn;
    UINavigationController* navController5 = [[UINavigationController alloc] initWithRootViewController:andSoOn;

    NSArray* viewControllerArray = [NSArray arrayWithObjects:navController1, navController2, navController3, navController4, navController5, nil];

    self.tabBarController = [[UITabBarController alloc] init];

    self.tabBarController.viewControllers = viewControllerArray;


    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;

}

NavigationControllerをモーダルに提示しないでください。それらはTabBarControllerの上に表示され、TabBarControllerは表示されなくなります。また、NavigationControllerでTabBarControllerを提示しようとしないでください。

于 2012-04-05T14:36:56.893 に答える