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;
Другие вопросы по тегам