iOS SWRevealViewController - передача данных между контроллерами
Я использую SWRevealViewController для реализации слайд-меню (с левой стороны) в моем приложении. Все работает нормально, но теперь я столкнулся с небольшой проблемой. Я хочу передать данные из моего "основного" контроллера представления (тот, который полностью виден, и я не называю его "frontViewController", потому что кажется, что это не передний). Я перепробовал все возможные варианты доступа к контроллеру слайд-меню и передачи ему данных. Вот что я попробовал:
(MyControllerClass*)self.revealViewController.rearViewController
(MyControllerClass*)self.revealViewController.frontViewController
Чем я пробовал такие вещи как self.revealViewController.navigationController[0]
, self.revealViewController.navigationController[1]
также это, self.revealViewController.viewControllers[0]
,self.revealViewController.viewControllers[1]
, Следующим шагом было внедрение prepareforsegue
и слушать идентификатор sw_front
а также sw_rear
, Но в любом из этих случаев я получил правду при проверке isKindOfClass[MyControllerclass class]
, Я предполагаю, что это потому, что все они имеют тип SWRevealViewController, не так ли? И prepareForSegue не вызывается вообще, но все показывает правильно
Главный вопрос для меня: как я могу передавать данные между моим боковым меню и моим "главным" (или фронтальным) контроллером (другой способ тоже подойдет)?
Спасибо
3 ответа
Я получил ответ. Вы не можете напрямую получить доступ к своим собственным контроллерам через SWRevealViewController (так как он подключен к NavigationController). Сначала вы получаете навигационный контроллер, который вам нужен, и через него вы получаете доступ к вашим контроллерам (и передаете данные). Вот код к теории:
UINavigationController* rearNavigationController = (UINavigationController*)self.revealViewController.rearViewController;
//here you get the navigationController which is connected to the controller you want, in my case i want the rear controller
if ([rearNavigationController.topViewController isKindOfClass[MyCustomViewController]]) {
MyCustomViewController* iWantYouController = (MyCustomViewController*)rearNavigationController.topViewController;
}
И это все. Теперь вы можете получить доступ (и установить) каждое свойство на вашем собственном контроллере
LoginViewController -> SWRevealViewController -> NavigationController -> HomeViewController
(HomeViewController - это frontViewController) Это последовательность ViewController, проходящих через SWRevealViewController
От LoginViewController до SWRevealViewController я использую segue. Для передачи данных я использую этот в prepareForSegue
,
if ([[segue identifier] isEqualToString:@"homeVC"]) {
SWRevealViewController *destination = [segue destinationViewController];
[destination loadView];
UINavigationController *navViewController = (UINavigationController *) [destination frontViewController];
if ([navViewController.topViewController isKindOfClass:[HomeViewController class]]) {
HomeViewController* homeVC = (HomeViewController*)navViewController.topViewController;
homeVC.title = @"Test1";
}
}
Создайте общий объект в appdelegate, затем вы сможете получить к нему доступ через viewContollers. Создайте свойство в appdelegate скажем
@property (nonatomic, strong) NSArray *sharedItem;
Теперь установите этот объект в вашем firstViewContoller как:
AppDelegate *appDel = (AppDelegate*) [UIApplication sharedApplication].delegate;
appDel.sharedItem = firstControllerObj;
И в вашем пункте назначения VC доступ к объекту как:
AppDelegate *appDel = (AppDelegate*) [UIApplication sharedApplication].delegate;
NSArray *receivingObj = appDel.sharedItem;