Запуск ViewController из AppDelegate
У меня есть настраиваемая схема URL, и я хочу открыть некий ViewController
, который не является корневым, когда я перехожу к этому URL. Я смог это сделать, а то, что осталось, это нажать ViewController
в navigationController
из 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
, которое я хочу запустить.
Любая идея, как я могу сделать это по-другому?
Ответы
Ответ 1
Проблема
Чтобы справиться с нажатием и всплытием viewControllers из AppDelegate, вам нужно использовать [UIApplication sharedApplication]
, который отслеживает все viewControllers, начиная с корневого.
Решение
В PUSH ViewController из AppDelegate
ListingViewController *listingVC = [[ListingViewController alloc] init];
[(UINavigationController *)self.window.rootViewController pushViewController:listingVC animated:YES];
В POP, который вы только что представили в ViewController, вам нужно использовать этот код
[(UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController popViewControllerAnimated:YES ];
Ответ 2
Если вы используете раскадровку, вы можете использовать нижние строки для нажатия вашего VC.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
YOURCLASS *obj=[storyboard instantiateViewControllerWithIdentifier:@"YOUR_CLASS_STORYBOARD_ID"];
[self.window.rootViewController.navigationController pushViewController:obj animated:YES];
Update: -
ListingViewController *listingVC = [[ListingViewController alloc] init];
UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:listingVC];
[self.window.rootViewController presentViewController:navCon animated:YES completion:nil];
Ответ 3
Напишите этот код в файле didFinishingWithLaunchingOptions
SecViewController *Vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"second"];
[(UINavigationController *)self.window.rootViewController pushViewController:Vc animated:YES];
Ответ 4
Для версии 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()
Ответ 5
Если вы хотите нажать UIViewController, вы, вероятно, забываете инициализировать его с помощью NibName:
LoginViewController *loginViewController = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:nil];
Ответ 6
Ваш 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;
}