Как получить доступ к Tab View Controller из другого View Controller

my раскадровкаУ меня проблемы с доступом к моим контроллерам представления под контроллером панели вкладок. Вот как выглядит моя раскадровка:

  1. Контроллер просмотра A (-> Контроллер просмотра страницы -> Контроллер просмотра C
  2. Контроллер представления A -> Контроллер панели вкладок (MyTabBarController.h/.m) -> Контроллер навигации (MyNavigationController.h/.m) -> Контроллер представления B (TabViewController.h/.m)
  3. Контроллер панели вкладок (MyTabBarController.h/.m) -> Контроллер представления D
  4. Контроллер панели вкладок (MyTabBarController.h/.m) -> Контроллер представления E

Из контроллера представления A у меня есть IBAction с именем loginButton, который подключен к контроллеру панели вкладок, и в настоящее время он выглядит так:

- (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:^{

    }];

}

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

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


person Community    schedule 20.12.2013    source источник
comment
Совершенно непонятно, что вы пытаетесь сделать. Если вы используете раскадровку и в ней есть различные контроллеры, то зачем вы создаете контроллер панели вкладок и контроллер навигации в коде? Вы должны быть в состоянии создать все это в раскадровке. Было бы полезно, если бы вы могли опубликовать изображение вашей раскадровки. Кроме того, это один из контроллеров, A, B, C или D, такой же, как и для входа в систему.   -  person rdelmar    schedule 20.12.2013
comment
@rdelmar Я новичок в этом, и я пытаюсь понять, как различные контроллеры представления работают вместе. Я написал код, потому что не мог вызвать экран под панелью вкладок. Без создания экземпляра контроллера панели вкладок/контроллера навигации/контроллера представления вкладок ничего не отображалось. Я мог бы просто пропустить контроллер панели вкладок и контроллер навигации и просто показать последний контроллер представления (C), но я действительно хотел бы понять, как вызывать эти контроллеры из первого контроллера, который является контроллером представления.   -  person    schedule 20.12.2013


Ответы (3)


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

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

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

person rdelmar    schedule 20.12.2013
comment
@LienneNguyen, хорошо, надеюсь, это помогло вам. Если это так, вы должны принять мой ответ, чтобы закрыть этот вопрос. - person rdelmar; 21.12.2013

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

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

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

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

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

person Stas Zhukovskiy    schedule 20.12.2013

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

person user1226119    schedule 20.12.2013
comment
Хорошо, я посмотрю, что такое синглтон, и проверю ваш гитхаб прямо сейчас :) Я понятия не имею, что это такое! Мне определенно нужно будет передавать данные всем этим контроллерам! - person ; 20.12.2013
comment
Я погуглил и обнаружил, что большинство людей рекомендуют не использовать синглтоны, потому что синглтоны являются глобальными. Вместо этого мы должны использовать инъекции зависимостей, так как это более простое решение. - person ; 21.12.2013