Передача данных из контроллера представления в контроллер панели вкладок в iOS
Я разрабатываю приложение для iOS, и теперь я в растерянности. Я пытаюсь передать данные из первого View Controller на первую вкладку TabBarViewController (с использованием раскадровки). Я нашел много обучающих программ, которые объясняют, как передавать данные между контроллерами представления, но ничто не работало с моей панелью вкладок. Я знаю, что контроллер панели вкладок содержит своего рода массив представлений. Связь между контроллером представления и контроллером панели вкладок осуществляется с помощью перехода (push). Итак, я подумал, что легко использовать метод prepareForSegue(). Как это:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([[segue identifier] isEqualToString:@"tab"]) {
// ...
}
}
К сожалению, связь между контроллером панели вкладок и каждым представлением панели вкладок не является реальной. Это всего лишь "отношения". Это означает, что нет никакого идентификатора segue, который я мог бы использовать для вышеупомянутого метода. Есть ли возможность использовать prepareForSegue в этом случае? Если нет, есть идеи, как решить эту проблему? Я знаю, что есть похожий вопрос, но ответ не был таким полезным. Нужно ли создавать новый файл для каждой вкладки (представления) в контроллере панели вкладок? Или возможно иметь один класс (m. & H.) Для всего контроллера панели вкладок, получая доступ к нескольким представлениям с помощью objectAtIndex()?
Заранее спасибо!
6 ответов
Вот моя установка, которая сработала:
- Настройка Segue:
- Настройка View Controller с переходом к Tab Bar Controller с 2 дочерними View Controllers в раскадровке
- Укажите идентификатор segue (
tab
)
- Настройка классов в раскадровке:
- View Controller class =
ViewController
- Класс контроллера панели вкладок =
TabBarController
- Контроллер панели вкладок Контроллер дочернего представления class =
TabsViewController
(разделен между обоими)
- View Controller class =
Настроить
labelString
Свойство в Tab Bar Controller:В
TabBarController.h
:@property (nonatomic, strong) NSString *labelString;
В
TabBarController.m
:@synthesize labelString;
Настроить
prepareForSegue
метод вViewController.m
:#import "TabBarController.h" ... -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if ([[segue identifier] isEqualToString:@"tab"]){ TabBarController *tabBar = [segue destinationViewController]; [tabBar setLabelString:[NSString stringWithFormat:@"This has been set"]]; } }
Настроить
UILabel
s для дочерних контроллеров панели вкладок.- Перетащите по умолчанию
UILabel
контролирует оба дочерних View Controllers Создать недвижимость в
TabsViewController.h
:@property (nonatomic, strong) IBOutlet UILabel *label;
крюк
5.1
а также5.2
в раскадровке
- Перетащите по умолчанию
Настроить
ViewDidLoad
метод вTabsViewController.m
:#import "TabBarController.h" ... @synthesize label; ... - (void)viewDidLoad { [super viewDidLoad]; TabBarController *tabBar = (TabBarController *)self.tabBarController; label.text = [NSString stringWithFormat:@"Tab %i: %@",[tabBar.viewControllers indexOfObject:self],tabBar.labelString]; }
Теперь при нажатии на 1-ю и 2-ю вкладки появятся метки Tab 0: This has been set
а также Tab 1: This has been set
соответственно.
Если ваша иерархия - Viewcontroller->UItabbarcontroller->ViewCOntroller
в моем случае я должен отправить данные на marketviewcontroller . В tabcontroller marketviewcontroller присутствует в индексе 0.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"tab"])
{
UITabBarController *tabar=segue.destinationViewController;
MarketViewController *marketViewcontroller=[tabar.viewControllers objectAtIndex:0];
// pass data to market view controller
[marketViewcontroller passobject:Yourdata];
// or
marketViewcontroller.value=Yourdata
}
}
in MarketViewController.h
@property(nonatomic,retain) NSString * value;
Как вы показываете свой TabBarViewController из вашего UIViewController?
Я догадываюсь с Segue. Если вы делаете это именно так, вы можете передавать данные в этот UITabBarController, который является "родителем" для всех контроллеров внутри вкладок.
Скажем, вы хотите передать строку в UITabBarController, вы должны определить свойство в этом контроллере и установить его до перехода.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"tab"])
{
UITabBarController *tabBarVC=segue.destinationViewController;
tabBarVC.stringToSet = @"hi";
}
}
Затем с помощью метода делегата у вас есть выбранный контроллер представления, поэтому вы можете передать родительское свойство дочерним элементам:
- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
viewController.stringToSet = self.stringToSet // self is UITabBarController
}
Посмотрите на синглтоны. Внутри вкладки вы создаете экземпляр вспомогательного класса, который реализует шаблон синглтона, гарантируя, что на самом деле существует только один единственный экземпляр. Это означает, что когда вторая вкладка создает экземпляр того же вспомогательного класса, у нее будет доступ к тому же объекту, который вы можете использовать для обмена данными...
например: http://www.galloway.me.uk/tutorials/singleton-classes/
Самый простой способ - создать пользовательский класс и установить значение из контроллера в пользовательский класс, а затем получить значение из пользовательского класса в контроллер.
Пример кода здесь:
Сначала создайте пользовательский класс, например
AppUtility.h
+(void)setXxxName:(NSString *)str;
+(NSString *)getXxxName;
AppUtility.m
static NSString *xxxname;
+(void)setXxxName:(NSString *)str{
xxxname=str;
}
+(NSString *)getXxxName{
return xxxname;
}
FirstController.m
импортировать пользовательский класс в контроллер
#import "AppUtility.h"
установите значение от первого контроллера до пользовательского класса, используйте приведенный ниже код для установки значения:
[AppUtility setXxxName:@"xyz"];
Второй контроллер.
импортировать пользовательский класс в контроллер
#import "AppUtility.h"
здесь получить значение из пользовательского класса, используйте приведенный ниже код, чтобы получить значение:
NSString *str = [AppUtility getXxxName];
В классе appUtility Используйте операторы nslog, чтобы убедиться, что значения верны или нет
Первым делом:
1- Вы хотите передать данные на вкладку по какой-то причине...
или же:
2- Вы хотите передать данные на свою вкладку, чтобы потом перейти на другую UIViewController
?
Если это второй вариант, то наиболее распространенным шаблоном для этого является синглтон. Где вы можете хранить общие данные, которые могут использоваться / повторно использоваться различными частями приложения.