Передача данных в контроллер 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);
таким образом, вам нужно только установить данные в таббаре, как показано выше, а затем получить к нему доступ, когда вам это нужно в дочернем представлении.