2017-01-27 8 views
-2

У меня есть UITabBarController с вкладками (say Tab1, Tab2, Tab3, Tab4) и UITabBarController моего RootViewController и я делаю API вызов в том же самом. Поскольку это RootViewController, я показываю Tab1 как мой по умолчанию View. Когда я получаю результаты в своем API-вызове в UITabBarController. Мне нужно share the details in real time к моим вкладкам. Я пробовал несколько идей (например, NotificationCenter, Singleton Class), но он не работает. Может ли кто-нибудь помочь мне исправить это? Заранее спасибо. Если у вас есть рабочий пример, я прошу вас поделиться им со мной.передать данные из UITabBarController на его взгляде ребенка контроллеры цели C в режиме реального времени

Img Представление:

enter image description here

+1

Как я понимаю, вы получаете целые данные на первой вкладке, я опубликовал пример, просто посмотрев и дайте мне знать, если есть какая-либо проблема. – vaibhav

+0

PLease показать, что вы пробовали. Вам необходимо установить модель данных, которая передает данные всем контроллерам. –

ответ

3

UITabBarController имеет свойство viewControllers, которое является массивом контроллеров отображения отображенных (по индексу на закладке позиции, но вы, вероятно, это не нужно). Одним из простых решений является то, что ваш подкласс UITabBarController получает данные, он может перемещаться по массиву viewControllers и проверять каждый из них на соответствие/ответ на селектор и соответственно обновлять.

Это, наверное, самый простой. Другим способом было бы иметь контроллеры представлений в регистре вкладок для обновлений. Таким образом, они соответствуют протоколу делегатов и получают ссылку на их контроллер панели вкладок (подкласс контроллера панели вкладок) и вызывают панель вкладок с надписью «наблюдать обновления». Контроллер панели вкладок сохраняет память зарегистрированных объектов наблюдения и вызывает каждый из них новыми данными.

Предполагается, что вы устанавливаете контроллеры просмотра вкладки в IB. Если вы делаете это программно, то со вторым вариантом вы можете просто привязать вкладки к контроллеру панели вкладок, когда вы их добавите. Если вы установите в IB, вы также можете сделать это, переопределив -prepareForSegue, поскольку вложение вкладок в корне рассматривается как segue, но вам все равно придется отбрасывать destinationViewController, поскольку любой подкласс может получать данные.

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

1

Это как раз такие же, как передавая значения к другому viewController, но здесь вам нужно использовать метод tabBarController's делегата в примере ниже:

Передача значения с помощью метода делегата от контроллера A:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
    ControllerB *controllerB = (ControllerB *) [tabBarController.viewControllers objectAtIndex:1]; 
    //In this example, there is only have 2 tab bar controllers (A and B) 
    //So, index 1 is where controller B resides and index 0 where controller A resides. 

    self.controllerB.data.text = @"some value!"; 
    //This will change the text of the label in controller B 
} 

Получение значения в контроллер B

// set property in controller B .h file 
@property(strong, nonatomic) UILabel *data; 

// in controller B .m file viewDidLoad method 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"getting data: %@",data.text); // getting value 
} 
+0

Спасибо Vaibhav !! Но моя проблема! Первый индекс вкладки отображается пользователю и когда ответ выполняется на контроллере панели вкладок. Данные должны прийти к первому указателю вкладки, а для остальных вкладок я пройду так же, как вы сказали мне. Как я смогу узнать, что ответ получен в UITabbarController. –

+0

@DeepakrajMurugesan Я не знаю, как вы получаете данные с сервера, но используя мой метод, вы сможете отразить данные в соответствующих классах 'UITabbarController', так что это ваши вопросы. Для ответа я предполагаю, что вы должны использовать некоторый метод делегирования соединений. – vaibhav

1

Как насчет

  • -Declare протокол делегата, скажем, Tab1ViewControllerDelegate с методом - (void) tab1ViewController:(Tab1ViewController *) tab1ViewController, didReceiveData: (NSDictionary *) data

  • обращаются с TabBarController подкласс делегата вашего tab1ViewController

  • когда tab1ViewController получает это данные, вызовите [self.delegate tab1ViewController: self, didReceiveData: datDict]

  • , то ваш TabBarController может распространять данные в своем массиве viewControllers