0

Я разрабатываю приложение для iOS5 и выше, и я не использую раскадровки или IB. Я создаю обычай UITabBarController и в моем AppDelegate Я вставляю в него 4 контроллера вида с 1 UINavigationController (не могу понять почему).Пользовательский UITabBarController и 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.

ответ

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; 
+0

Отлично! Я попробую и отправлю отчет! –

2

Должен ли я создать отдельный UINavigationController для каждой вкладки

Если вы хотите перейти на каждой вкладке, ДА вы должны добавить каждый ViewController встроенный в navigationController.

0

См мой ответ (vidyanand) через ссылку ниже

UITabBarController Issue

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];

1

Предположим, у вас есть tabbarController.Теперь вы можете добавить любой viewController или любой NavController в свой tabController. NavController может содержать viewController. Но у вас может быть путаница, когда вы будете использовать navController или viewController. Вы будете использовать viewController, где вам не нужна навигация, я имею в виду то, где вам не нужно.

Вот пример кода, в котором первое представление содержит только представление, а второе представление содержит контроллер навигации. Вы не можете выдвигать новый вид в первом представлении, но вы можете легко выдвинуть новый вид во втором представлении.

-(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]; 
} 

Назовите этот метод из didFinishLaunchingWithOptions в AppDelegate. здесь HomeView и FloorPlanView - это два разных представления, вам нужно сначала добавить эти представления и файл класса.

+0

Спасибо за подавляющее объяснение! –

Смежные вопросы