Ios 从AppDelegate启动ViewController

Ios 从AppDelegate启动ViewController,ios,uiviewcontroller,appdelegate,Ios,Uiviewcontroller,Appdelegate,我有一个自定义的URL方案,我想打开一个特定的ViewController,当我转到这个URL时,它不是根目录。我已经能够做到这一点,剩下的就是将这个ViewController从AppDelegate推到navigationController中,在这里我像这样处理我的URL: - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *

我有一个自定义的URL方案,我想打开一个特定的
ViewController
,当我转到这个URL时,它不是根目录。我已经能够做到这一点,剩下的就是将这个
ViewController
AppDelegate
推到
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

你知道我该怎么做吗?

如果你使用故事板,那么你可以用下面的文字来推动你的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];

如果要推送UIViewController,可能忘记了使用NibName初始化它:

LoginViewController *loginViewController = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:nil];
问题 要处理从AppDelegate中推送和弹出ViewController的问题,您需要使用
[UIApplication sharedApplication]
,它从根节点开始跟踪所有ViewController


解决方案 到AppDelegate推送视图控制器

ListingViewController *listingVC = [[ListingViewController alloc] init];
[(UINavigationController *)self.window.rootViewController pushViewController:listingVC animated:YES];
弹出刚才显示的ViewController,需要使用以下代码

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


使用启动选项在didfishing中编写此代码

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

您的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;
}

对于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()

您是否收到任何错误?没有,应用程序只是在其根视图控制器上正常启动您是否尝试设置断点并检查它是否进入第二条if语句?从我看到的情况来看,您说所有内容都是以编程方式创建的,如果没有情节提要,您在哪里设置rootViewController?有一个情节提要只有rootViewController,其他所有内容都是通过编程方式创建的。不,我只是发现它确实启动了活动,但晚了10-15秒@jomafer是的,它确实输入了我在那里有NSLog,但我在这里发布时删除了它们没有故事板,我所有的ViewController都是通过编程创建和推送的,然后你应该在你的ListingViewController分配中使用NIB初始化。好的,所以你需要重新检查你的代码,因为它可能无法加载任何视图,导致屏幕空白(如果这是你得到的)。我没有得到一个空白屏幕,应用程序只是正常打开,但没有推动ViewController,使用presentModalView它可以工作,但我的所有项目都基于navigationController,此后我无法导航,所以我不能使用
presentModalView
现在它“可以工作了”。视图控制器已打开,但这会创建一个新的导航控制器,并且我没有通常使用的后退按钮:p视图控制器是代码创建的,没有故事板,没有Nib。这种方式还会创建一个新的导航控制器。正确的方式是
UINavigationController*nav=(UINavigationController*)self.window.rootViewController;[nav pushViewController:listingView动画:是]
但问题在于延迟,而不是服务器的延迟,因为我可以在控制台上看到它的100毫秒。如果您需要推送它,您只需从navigationController(rootViewController)推送。关于延迟,您说正在以编程方式加载ViewController?如果您在viewDidLoad上创建内容,请在viewD上移动它们我看到了,并给我同样的反馈,大约7秒,这不是正常的删除所有你在ViewWillDisplay、ViewDidDisplay和viewDidLoad上初始化的操作和方法,看看你的ViewController或他们正在加载的数据是否有问题,不管我是否修复了它。我是从后台线程而不是t他是主线程。现在它启动得很快。我觉得很愚蠢-_-