【问题标题】:iOS SWRevealViewController - pass data between controllersiOS SWRevealViewController - 在控制器之间传递数据
【发布时间】:2015-02-23 21:30:57
【问题描述】:

我正在使用 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 并监听segue 标识符sw_frontsw_rear。但在这些情况下,我在检查isKindOfClass[MyControllerclass class] 时得到了正确的结果。我认为这是因为所有这些都是 SWRevealViewController 类型,不是吗?而且,prepareForSegue 根本没有被调用,但一切都正常显示

我的主要问题是,如何在我的侧边菜单和我的“主”(又名前端)控制器之间传递数据(其他方式也可以)?

谢谢

【问题讨论】:

    标签: ios objective-c slide swrevealviewcontroller pass-data


    【解决方案1】:

    LoginViewController -> SWRevealViewController -> NavigationController -> HomeViewController(HomeViewController 的frontViewController) 就是通过SWRevealViewController 的ViewController 的顺序

    从 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";
        } 
    }
    

    【讨论】:

      【解决方案2】:

      我得到了答案。您不能通过 SWRevealViewController 直接访问您自己的控制器(因为它连接到 NavigationController)。首先,您获得所需的 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;
      }
      

      就是这样。现在您可以访问(和设置)自定义控制器上的每个属性

      【讨论】:

      • 嗨,我在为我的菜单识别视图控制器时遇到了同样的问题,你知道如何快速做到这一点吗?您还可以发布完整的代码吗?您还使用了哪个 segue 标识符?谢谢
      • 嗨阿里,你的问题解决了吗?我没有与 SWIFT 合作,但如果有任何帮助,我可以发布 Objective C 代码?
      • 我正在尝试您的代码,但它在 if([rearNavigationController.topViewController isKindOfClass[MyCustomViewController]]) 中显示错误
      • 但是您确实将 MyCustomViewController 更改为您的控制器名称?我只是将它用作占位符...
      【解决方案3】:

      在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;
      

      【讨论】:

      • 这是唯一的方法吗?我不认为最好的方法是创建一个全局变量。必须有可能以某种方式访问​​控制器,否则,在我看来,SWRevealViewController 将毫无用处
      猜你喜欢
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2017-01-12
      • 2011-07-09
      相关资源
      最近更新 更多