web-dev-qa-db-ja.com

AppDelegateからのViewControllerの起動

カスタムURLスキームがあり、このURLにアクセスしたときにルートではない特定のViewControllerを開きたいです。私はそれを行うことができ、残りはViewControllernavigationControllerからAppDelegateにプッシュしています。ここで、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は起動しません。どのように私はそれを別の方法で行うことができますか?

12
Elgert

問題

AppDelegateからのviewControllerのプッシュとポップを処理するには、ルートコントローラから始めて、すべてのviewControllerを追跡する[UIApplication sharedApplication]を使用する必要があります。


解決

To Push ViewController from AppDelegate

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

[〜#〜] pop [〜#〜]先ほど示したViewControllerを実行するには、このコードを使用する必要があります

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

12
E-Riddie

ストーリーボードを使用している場合は、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];
7
nikhil84

このコードをdidFinishingWithLaunchingOptionsで記述します

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

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()
1
mike vorisis

UIViewControllerをプッシュしたい場合は、おそらくNibNameでそれを初期化するのを忘れています。

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

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;
}
0
n.by.n