Передача данных в контроллер Tabbar

У меня есть проект раскадровки, и я хотел бы передать некоторые данные из представления в контроллер панели вкладок, информация будет распространяться между вкладками. После некоторых исследований я нашел очень похожую проблему: iOS раскадровка передачи данных navigationViewController но единственная проблема с этим решением заключается в том, что он не передавался на контроллер панели вкладок. Мне было интересно, нужно ли передавать данные на каждую вкладку или я могу передать ее контроллеру панели вкладок, а затем распространить его оттуда? Заранее спасибо за помощь!

в настоящее время я использую следующие, но я получаю сообщение об ошибке:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     if ([segue.identifier isEqualToString:@"FoodPage"]) {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    UINavigationController *nav = [segue destinationViewController];
    FoodViewController *destViewController = (FoodViewController*) nav.topViewController;
    destViewController.Foods = [foodArray objectAtIndex:indexPath.row];
  }
}

2 ответов


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

UINavigationController *nav = [self.tabBarController.viewControllers objectAtIndex:<THE_INDEX_NUMBER_FOR_YOUR_NAVIGATION_CONTROLLER];

как только вы это сделаете, вы получите ссылку на свой FoodViewController снова указав номер индекса на UINavigationController (т. е. если он сверху, то 0):

FoodViewController *destViewController = (FoodViewController*) [self.nav.viewControllers objectAtIndex:0];

обновление:

теперь, когда у меня есть лучшая идея, что вы хотели бы достичь:

вы используете UITabbarController в который встроены ваши другие контроллеры.

Сценарий / Пример Case:

допустим, у нас было 2 контроллера вида, контроллер A и контроллер B, соответственно, оба встроены в A UITabbarController.

что мы хотим:

мы пытаемся изменить текст UILabel в контроллере B от контролера А.

первый, объявить property в контроллере B in .h:

@property(strong, nonatomic) UILabel *aLabelInControllerB;

второй, объявите свойство a (или ivar) в вашем контроллере A:

@property(strong, nonatomic) ControllerB *controllerB;

если вы используете UITabbarController вам не нужно использовать альтернативы, вы могли бы просто возьмите UITabbarController via self.tabBarController;

вопрос: "как бы я узнал, когда мой контроллер панели вкладок нажата, а затем изменить текст метки в контроллере B?"

мы делаем так:

установить контроллер A в качестве делегата UITabbarController by:

в контроллере A .h, добавить:

@interface <Your_Controller> : UIViewController <UITabBarControllerDelegate>

на viewDidLoad контроллера A:

self.tabBarController.delegate = self;

и в контроллере A .m, реализуйте этот метод:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    self.controllerB = (ControllerB *) [tabBarController.viewControllers objectAtIndex:1];
    //In our example here, we only have 2 view controllers (A and B)
    //So, index 1 is where controller B resides.

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

и когда появится контроллер B, вы увидите, что текст метки будет изменен на " Привет!"

настройка a NSString в контроллере B следует той же процедуре.

Ex:self.controllerB.stringInControllerB = @"Hi from controller B!";

надеюсь, это поможет.



обновление 2:

переход от ячейки представления таблицы к контроллеру панели вкладок? компания OKI.. Вот решение. Я использую только одну клетку в своем примере, поэтому, если вы захотите иметь больше клеток в будущем,я оставлю это на ваше усмотрение.

давайте взгляните на раскадровку раскадровки:

в раскадровке, управления перетащите из ячейки на контроллер панели вкладок.

добавить UINavigationController как на картинке.

в своем UITableViewController .м:

добавить 2 свойства:

@property (strong, nonatomic) UITabBarController *myTabbarController;
@property (strong, nonatomic) YourFirstViewController *myFirstViewController;

просто дружеское напоминание:

не забудьте добавить:

self.tableView.delegate = self;
self.tableView.dataSource = self;

добавьте в таблицу следующее контроллер вида:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    self.myTabbarController = (UITabBarController*) [segue destinationViewController];
    self.myFirstViewController = [self.myTabbarController.viewControllers objectAtIndex:0];
    self.myFirstViewController.stringFromTableViewController = @"Hi from TableViewController!";
}

и myFirstViewController добавить 2 свойства .h:

@property (strong, nonatomic) NSString *stringFromTableViewController;
@property (strong, nonatomic) YourSecondViewController *secondViewController;

как и во втором редактировании выше, ваш первый контроллер представления должен быть делегатом UITabBarControllerDelegate и реализовать этот метод:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    self.secondViewController = (YourSecondViewController*) viewController;
    self.secondViewController.aLabel.text = self.stringFromTableViewController; 
}

как и раньше, ничего не нужно менять в SecondViewController.

я сам запустил это; должно быть хорошо, чтобы пойти на вашу установку.

наслаждайтесь.


также можно получить доступ к данным из таббара в самих дочерних viewcontrollers таббара, например:

MyTabbarViewController *tabbar = (MyTabbarViewController *)self.tabBarController;
NSLog(@"%@", tabbar.data);

таким образом, вам нужно только установить данные в таббаре, как показано выше, а затем получить к нему доступ, когда вам это нужно в дочернем представлении.