【问题标题】:Launching ViewController from AppDelegate从 AppDelegate 启动 ViewController
【发布时间】:2014-11-11 12:59:32
【问题描述】:

我有一个自定义 URL 方案,我想打开某个 ViewController,当我转到此 URL 时它不是根。我已经能够做到这一点,剩下的就是将这个ViewControllerAppDelegate 推入navigationController,在那里我像这样处理我的URL:

- (BOOL)application:(UIApplication *)application
     openURL:(NSURL *)url
     sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation {

if ([[url scheme] isEqualToString:@"njoftime"]) {

    NSDictionary *getListingResponse = [[NSDictionary alloc]init];
    getListingResponse = [Utils getListing:[url query]];;

    if ([[getListingResponse objectForKey:@"status"] isEqualToString:@"success"]) {
         ListingViewController *listingView = [[ListingViewController alloc]init];
         [self.window.rootViewController.navigationController pushViewController:listingView animated:YES];
         return YES;
    }

但它只启动我的应用程序而不是我想要启动的ListingViewController。 知道我该怎么做吗?

【问题讨论】:

  • 你有什么错误吗?
  • 没什么,应用只是在其根视图控制器上正常启动
  • 您是否尝试过设置断点并检查它是否进入第二个 if 语句?
  • 据我所见,您说一切都是以编程方式创建的,如果没有情节提要,您在哪里设置 rootViewController?
  • 有 1 个故事板只有 rootViewController,其他一切都是以编程方式创建的。不,我只是发现它确实启动了活动,但晚了 10-15 秒。 @jomafer 是的,它确实输入了我那里有 NSLogs,但是我在这里发布时删除了它们

标签: ios uiviewcontroller appdelegate


【解决方案1】:

如果您使用故事板,那么您可以使用以下几行来推送您的 VC。

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
 YOURCLASS *obj=[storyboard instantiateViewControllerWithIdentifier:@"YOUR_CLASS_STORYBOARD_ID"];
[self.window.rootViewController.navigationController pushViewController:obj animated:YES];

更新:-

ListingViewController *listingVC = [[ListingViewController alloc] init];
UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:listingVC];
[self.window.rootViewController presentViewController:navCon animated:YES completion:nil];

【讨论】:

  • 没有 StoryBoard,我所有的 ViewController 都是以编程方式创建和推送的
  • 那么你应该在你的ListingViewController分配中initWithNib
  • 好的,所以你需要重新检查你的代码,因为它可能没有加载任何视图,导致空白屏幕(如果你得到的是)。
  • 我没有得到一个空白屏幕,应用程序只是正常打开但没有推送 ViewController,使用 presentModalView 它可以工作,但我所有的项目都是基于 navigationController 之后我无法导航所以我不能使用presentModalView
  • 现在它“有点作用”。视图控制器已打开,但这会创建一个新的导航控制器,并且我没有通常拥有的后退按钮:P
【解决方案2】:

如果你想推送一个 UIViewController,你可能忘记用 NibName 初始化它:

LoginViewController *loginViewController = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:nil];

【讨论】:

  • viewController 是代码创建的,没有 Storyboard,没有 Nib。
【解决方案3】:

问题

要处理从 AppDelegate 推送和弹出视图控制器,您需要使用 [UIApplication sharedApplication] 跟踪所有视图控制器,从根目录开始。


解决方案

AppDelegate

PUSH ViewController
ListingViewController *listingVC = [[ListingViewController alloc] init];
[(UINavigationController *)self.window.rootViewController pushViewController:listingVC animated:YES];

POP你刚才展示的那个ViewController,你需要使用这段代码

[(UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController popViewControllerAnimated:YES ];

【讨论】:

  • 这种方式也会创建一个新的导航控制器。正确的方法是 UINavigationController *nav = (UINavigationController *)self.window.rootViewController; [nav pushViewController:listingView animated:YES]; 但问题是延迟而不是服务器的延迟,因为我可以在控制台上看到它的 100 毫秒
  • 如果你需要推送它,你只需从rootViewController的navigationController推送。关于延迟,您说 viewController 正在以编程方式加载?如果您在 viewDidLoad 上创建东西,那么将它们移到 viewDidAppear 上,并给我反馈
  • 一样,7秒左右,不正常
  • 去掉你在viewWillAppear、viewDidAppear和viewDidLoad上初始化的所有操作和方法,看看你的viewControllers或者他们正在加载的数据是否有问题
  • 没关系,我修好了。我从后台线程而不是主线程推送 ViewController。现在它启动速度很快。我觉得自己很蠢-_-
【解决方案4】:

在 didFinishingWithLaunchingOptions 中编写此代码

  SecViewController *Vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"second"];
   [(UINavigationController *)self.window.rootViewController pushViewController:Vc animated:YES];

【讨论】:

    【解决方案5】:

    您的 AppDelegate.m 应如下所示:

    #import "TestViewController.h"
    
    @interface AppDelegate ()
    
    @property (strong, nonatomic) TestViewController *viewController;
    
    @end
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
      self.viewController = [[TestViewController alloc]init];
      self.window.rootViewController = self.viewController;
      [self.window makeKeyAndVisible];
    
      return YES;
    }
    

    【讨论】:

      【解决方案6】:

      对于 Swift 3 版本:

      let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
      let initialViewControlleripad : UINavigationController = mainStoryboardIpad.instantiateViewController(withIdentifier: "initial") as! UINavigationController
      self.window = UIWindow(frame: UIScreen.main.bounds)
      self.window?.rootViewController = initialViewControlleripad
      self.window?.makeKeyAndVisible()
      

      【讨论】:

        猜你喜欢
        • 2018-02-27
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多