2014-12-26 4 views
4

Я использую SWRevealViewController для реализации меню слайдов (слева) в приложении. Все работает нормально, но теперь я столкнулся с небольшой проблемой. Я хочу передать данные с моего «основного» контроллера представлений (тот, который полностью видим, и я его не называю «frontViewController», потому что кажется, что это не передний). Я пробовал все возможные возможности, которые я могу придумать, чтобы получить доступ к контроллеру меню слайдов и передать ему данные. Вот что я пробовал:iOS SWRevealViewController - передавать данные между контроллерами

(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 и прослушивание идентификатора segue sw_front и sw_rear. Но не в этих случаях, я прав, когда проверяю isKindOfClass[MyControllerclass class]. Я предполагаю, что это потому, что все они имеют тип SWRevealViewController, не так ли? И, prepareForSegue не вызывается вообще, но все правильно отображается

Главный вопрос для меня: как я могу передавать данные между моим боковым меню и моим «главным» (или передним) контроллером (в другом случае также было бы хорошо)?

благодаря

ответ

5

Я получил ответ. Вы не можете напрямую обращаться к своим контроллерам через 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; 
} 

И вот оно. Теперь вы можете получить доступ (и установить) каждое свойство на пользовательский контроллере

+0

Привет, у меня такая же проблема с идентификацией контроллера вида для моего меню, знаете ли вы, как это сделать быстро? Не могли бы вы также опубликовать код для вашего полного сеанса? И какой идентификатор segue вы использовали? Спасибо –

+0

Привет Али, вы решили свою проблему? Я не работаю с SWIFT, но могу ли я поставить Objective C-код, если он поможет? – user3466562

+0

Я пытаюсь ваш код, но он показывает ошибку в if ([rearNavigationController.topViewController isKindOfClass [MyCustomViewController]]) –

0

Создать общий объект в 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; 
+0

Это единственный способ сделать это? Я не думаю, что лучший способ - сделать глобальную переменную. Должно быть возможно каким-то образом получить доступ к контроллерам, иначе, на мой взгляд, SWRevealViewController был бы бесполезен – user3466562

0

LoginViewController -> SWRevealViewController -> NavigationController -> HomeViewController (HomeViewController-й лет frontViewController) Вот последовательность ViewControllers проходящего через 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"; 
    } 
} 
Смежные вопросы