3

my storyboard У меня возникают проблемы с доступом к контроллерам моего представления под контроллером панели вкладок. Вот что моя раскадровки выглядит следующим образом:Как получить доступ к контроллеру табуляции из другого контроллера просмотра

  1. View Controller A (-> Page View Controller -> View Controller C
  2. View Controller A -> Tab Bar Controller (MyTabBarController.h/.м) -> Навигация контроллер (MyNavigationController.h/.м) -> View Controller B (TabViewController.h/.м)
  3. Tab Bar Controller (MyTabBarController.h/.м) -> View Controller D
  4. Tab Bar Controller (MyTabBarController. ч /. м) -> Просмотр контроллера E

С View Controller А у меня есть IBAction называется loginButton, который подключен к контроллеру Tab Bar, и в настоящее время выглядит следующим образом:

- (IBAction)loginButton:(id)sender { 

    MyNavigationController *localNavigationController; 

    UIStoryboard * storyboard = self.storyboard; 

    MyTabBarController *tbc = [[MyTabBarController alloc] init]; 

    NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:1]; 

    TabViewController *login = [storyboard instantiateViewControllerWithIdentifier: @ "TabViewController"]; 

    localNavigationController = [[UINavigationController alloc] initWithRootViewController:login]; 

    localNavigationController.delegate = self; 

    [localControllersArray addObject:localNavigationController]; 


    tbc.viewControllers = localControllersArray; 


    tbc.delegate = self; 
    tbc.moreNavigationController.delegate = self; 


    tbc.selectedIndex = 0; 

    [self presentViewController:tbc animated:YES completion:^{ 

    }]; 

} 

Я не в состоянии получить это отображается правильно. Я получаю кучу предупреждений в этом фрагменте кода. и он также не показывает различные элементы табуляции в нижней части панели вкладок, даже если я поместил изображения/текст на каждую вкладку.

Как я могу правильно отобразить/получить доступ к контроллерам представлений внутри контроллера панели вкладок? (т.е. View Controllers C/D/E)?

+1

Это действительно неясно, что вы пытаетесь сделать. Если вы используете раскадровку, и в ней есть эти различные контроллеры, то почему вы создаете экземпляр контроллера панели вкладок и контроллера навигации в коде? Вы должны иметь возможность создать все это в раскадровке. Было бы полезно, если бы вы могли разместить изображение своей раскадровки.Кроме того, это один из контроллеров, A, B, C или D, то же самое, что и «login» – rdelmar

+0

@rdelmar. Я новичок в этом, и я пытаюсь понять, как работают разные контроллеры представлений. Я написал код, потому что не мог вызвать экран под панелью вкладок. Без создания экземпляра контроллера панели/контроллера навигации/контроллера табуляции ничего не было показано. Я мог бы просто пропустить контроллер панели вкладок и контроллер навигации и просто открыть последний контроллер представлений (C), но я действительно хотел бы понять, как вызывать эти контроллеры от первого контроллера, который является контроллером представления. –

ответ

4

В раскадровке, которую вы показываете в своем вопросе, уже есть контроллер панели навигации, контроллер навигации и контроллер входа в систему, правильно подключенные к каждому Другие. Из-за этого вы не должны создавать экземпляр нового контроллера панели вкладок или контроллера навигации в коде - они будут созданы экземпляром раскадровки при создании экземпляра контроллера панели вкладок. Таким образом, единственное, что вам нужно сделать, это дать контроллеру панели вкладок в раскадровке идентификатор, и сделать это (предположим, что идентификатор называется MyTabBarController):

- (IBAction)loginButton:(id)sender { 
    UITabBarController *tbc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyTabBarController"]; 
    [self presentViewController:tbc animated:YES completion:nil]; 
} 

Вы даже не нужен этот код если вы управляете перетаскиванием из кнопки «Вход» в контроллер панели вкладок и выберите «Модаль». Это создаст modal segue, который будет представлять контроллер панели вкладок без кода вообще.

+0

Спасибо @rdelmar! письмо 0 код работал !! –

+0

@LienneNguyen, Хорошо, надеюсь, это помогло вам. Если это так, вы должны принять мой ответ, чтобы закрыть этот вопрос. – rdelmar

0

Если вы просто хотите, чтобы выбрать другую вкладку из контроллера TabBar затем использовать что-то вроде этого:

UITabBarController *tabBar = (UITabBarController *)self.window.rootViewController; 
[tabBar setSelectedIndex:3]; 

Обратите внимание, что если контроллер TabBar является начальным контроллером представления вы можете получить экземпляр этого он в applicationDidFinishLaunching метод и сохранить его в AppDelegate. Тогда вы сможете получить к нему доступ, как это:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

Не забудьте импортировать AppDelegate.h

0

Я Recommand вам использовать Singleton общего экземпляр для обмена несколько информации образует несколько контроллеров. Это хороший шаблон дизайна для вас. Я пишу образцы использования шаблонов дизайна на какао (см. https://github.com/leverdeterre/DesignPatterns -> Реальный синглтон)

+0

ОК, я посмотрю, что такое синглтон, и проверьте свой github прямо сейчас :) Я понятия не имею, что это такое! Мне определенно нужно будет передавать данные обо всех этих контроллерах. –

+0

Я googled вокруг и обнаружил, что большинство людей рекомендуют не использовать синглтоны, потому что синглтоны являются глобальными. Вместо этого мы должны использовать инъекции зависимостей, поскольку это более простое решение. –

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