Как передать данные с контроллера панели вкладок на одну из его вкладок?

У меня есть UITabBarController, настроенный в раскадровке. Я хочу передать словарь данных из контроллера панели вкладок для использования на соответствующей дочерней вкладке, которая является стандартным UIViewController.

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

-Остин
p.s. я новичок и до сих пор зависел от раскадровки для переходов контроллера просмотра


person austin    schedule 19.05.2012    source источник
comment
У меня проблемы с разбором этого. Как вы храните данные в UITabBarController? Вы подклассифицируете UITabBarController? Контроллер панели вкладок на самом деле является всего лишь метаконтроллером, используемым для управления контроллерами представления. В структуре Apple MVC для привязки данных модели к представлениям следует использовать контроллеры представлений. Если вам нужно обмениваться данными между контроллерами представления сложным образом, вы можете использовать уведомления, создать синглтон, сохранить данные в делегате приложения или использовать общее внешнее хранилище, такое как CoreData.   -  person Jeffery Thomas    schedule 19.05.2012
comment
Джефф, будьте конкретны, я передаю данные в UITabBarController, однако я не понимаю, как распределять данные по отдельным контроллерам представления с вкладками.   -  person austin    schedule 24.05.2012


Ответы (6)


Это заняло пару дней, но я нашел простое решение. В методе viewDidLoad моего TabBarController я могу получить доступ и установить атрибуты моих вкладок с вкладками, используя

    [[self viewControllers] objectAtIndex:0]

или любой другой индекс, к которому вы хотите получить доступ.

Сохранение этого как экземпляра моего tab1_viewController дает мне указатель на объект, из которого я могу получить и установить значения своих свойств. Изначально это было неясно, потому что раскадровка создала для меня объекты tab_viewController. У меня никогда не было возможности инициализировать их так, как я хотел!

person austin    schedule 25.05.2012
comment
[self.viewVontrollers firstObject] более безопасен. - person Blazej SLEBODA; 31.05.2015
comment
О более простом решении нельзя было и мечтать. Золото!! В нем рассматриваются решения и обсуждаются возможные проблемы с более чем 5 вкладками. makeapppie.com/2015 /02/04/ - person DogCoffee; 07.08.2015

Лучше всего использовать уведомления.

На панели вкладок вы должны сделать следующее:

NSDictionary *myDictionary; // Populate this with your data.

// Fire the notification along with your NSDictionary object.
[[NSNotificationCenter defaultCenter] postNotificationName:@"Some_Notification_Name" 
                                                    object:myDictionary];        

Затем на дочерней вкладке ViewController вы должны «прослушать» это уведомление.

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(handleNotification:) 
                                             name:@"Some_Notification_Name" 
                                           object:nil];

- (void)handleNotification:(id)object {
  // Use your NSDictionary object here.
}
person melsam    schedule 19.05.2012
comment
у меня проблемы с тем, чтобы заставить это работать. Я пытался поместить код tabBarController в его viewDidLoad и в его tabBarController:didSelectViewController, но безуспешно. Я помещаю дочерний код в его viewDidLoad - person austin; 24.05.2012

Если вы получили UINavigationController в качестве одного из ваших UITabBarController контроллеров представления, вы можете сделать следующее:

NSArray *viewControllers = [self.tabBarController viewControllers];
UINavigationController *myNavController = (UINavigationController *)viewControllers[2];
MyViewController *myController = [[myNavController childViewControllers] firstObject];
// Remember to alloc/init objects first if the objects haven't been initialized already.
[myController.whateverArray = [[NSArray alloc] initWithArray:@[@"Example1", @"Example2"]];
[self.tabBarController setSelectedIndex:2];
person emotality    schedule 10.10.2014

Использование Swift

Если у вас есть UINavigationController в качестве одной из вкладок в UITabBarController, вы хотите получить экземпляр контроллера дочернего представления вместо создания нового экземпляра и передать его в контроллер представления навигации перед изменением индекса представления вкладки. Ты можешь это сделать...

В этом примере кода предполагается, что контроллер навигации находится на первой вкладке (индекс 0), а «childViewController» встроен в контроллер навигации.

let viewControllers = self.tabBarController?.viewControllers

let navController = viewControllers![0] as! UINavigationController

let profileViewController = self.storyboard?.instantiateViewControllerWithIdentifier("childViewController") as? ProfileViewController

profileViewController!.parameter1 = "Value1"

profileViewController!.parameter2 = "Value2"

navController.pushViewController(profileViewController!, animated: true)

self.tabBarController?.selectedIndex = 0
person Karthik Murugesan    schedule 23.08.2016

С Swift:

if let navController = self.tabBarController?.viewControllers?[1] as? UINavigationController{
        if let testController = navController.childViewControllers.first as? MyViewController{
            testController.data = data
            self.tabBarController?.selectedIndex = 1
        }
}
person Dasoga    schedule 26.01.2017

Получил это работает ...

У меня есть 3 контроллера представления, мне нужно передать массив от одного к другому.

Вот что я сделал

Добавление данных к одному из Tab View Controller

NSArray *viewControllers = [self.tabBarController viewControllers];
    ListViewController *listView = (ListViewController *)viewControllers[1];
    listView.myArray = self.myArray;
    [self.tabBarController setSelectedIndex:1];

И после этого загрузите контроллер представления, вот и все

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ListViewController *listView = (ListViewController *)[storyboard instantiateViewControllerWithIdentifier:@"IDListView"];
person Swaroop S    schedule 25.10.2013