【问题标题】:Pushing iOS UIViewController from NSObject class从 NSObject 类推送 iOS UIViewController
【发布时间】:2014-06-22 19:25:01
【问题描述】:

我的 AppDelegate 中有以下代码。它在检查应用内购买过期期间使用,如果订阅即将过期,将显示一个弹出窗口供用户选择续订,如果他们这样做,它将把应用内购买的视图控制器推送到堆栈上。

我想将代码从 AppDelegate 中移出,并移到它自己的 NSObject 类中(只是为了整洁)。但是,如何从另一个类调用推送视图控制器?

self.window.rootViewController 在 NSObject 类中不存在,所以当然不会起作用。

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
            UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
            UICollectionViewController *ivc = (UICollectionViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"IAPViewController"];
            [navigationController pushViewController:ivc animated:YES];

【问题讨论】:

    标签: ios uiviewcontroller uinavigationcontroller nsobject


    【解决方案1】:

    在你的 NSObject 类中,当你想推送一个 vc 时,通过 NSNotificationCenter 发布一个通知:

    [[NSNotificationCenter defaultCenter] postNotificationWithName:@"PushMyViewControllerNote" object:nil];

    并在 AppDelegate.m 中注册观察者:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //... [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(handlePushVCNotification:) 名称:@"PushMyViewControllerNote" 对象:无]; //... 返回是; } //... - (void)handlePushVCNotification:(NSNotification *)note { // 首先你必须找到当前可见的视图控制器 // 怎么做,自己找吧 :) // 但你可以查看 https://gist.github.com/snikch/3661188 UIViewController *visibleVC = [self findVisibleVC]; UINavigationController *nc = visibleVC.navigationController; UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil]; UICollectionViewController *ivc = (UICollectionViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"IAPViewController"]; [nc pushViewController:ivc 动画:YES]; }

    【讨论】:

      【解决方案2】:

      你应该做的是创建一个继承自 NSObject 的单独类。将其称为 AppPurchase。然后,将您的 AppPurchase 类导入您的应用委托。至于推送视图控制器,该代码应该与您的 AppPurchase 类分开。

      AppPurchase 类是模型的一部分,不应负责推动视图控制器。如果您的 AppPurchase 实例中的数据发生更改,则控制器可以采取一些措施并更改您的视图。

      您应该学习更多关于 MVC 或模型-视图-控制器的信息。

      【讨论】:

      • 非常好!是的,只见树木不见森林,错过了显而易见的事情。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多