2014-11-21 5 views
2

Я пытаюсь вызвать функцию LoadWebpage в ViewController.m из AppDelegate.m.Метод вызова ViewController из AppDelegate после URL-схемы OpenURL

Я включил мое приложение с помощью схемы URL, так что ссылки «urlscheme: //? Querystring» в Safari открывают мое приложение. Я собираю схему URL в AppDelegate (могу сказать, зарегистрировав, что это работает) и хотел бы заполнить глобальную переменную с помощью запроса и затем вызвать мой метод LoadWebPage, чтобы контроллер представления мог использовать глобальную переменную и открыть запрошенный веб-сайт в элементе управления WebView.

Я следую за this tutorial.

Это является AppDelegate.m:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ 
    NSLog(@"Calling Application Bundle ID: %@", sourceApplication); 
    NSLog(@"URL scheme:%@", [url scheme]); 
    NSLog(@"URL query:%@", [url query]); 
    URLString = (NSString *)[url query]; //extern variable 

    [self.ViewController loadWebpage]; 
    return YES; 

} 

И в ViewController.m:

- (void)LoadWebpage{ 

    NSString *strURL=URLString; //more logic will be required to get the appropriate url from the query string. 
    NSURL *url = [NSURL URLWithString:strURL]; 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
    [self.webview loadRequest:urlRequest]; 

} 

Но линия [self.ViewController loadWebpage]; имеет ошибку «Property 'ViewController' не найден на объект типа ' AppDelegate».

Я предполагаю, что мне нужно синтезировать ссылку на open viewcontroller, но я не могу найти информацию о том, как это сделать. Это лучший способ справиться с этим?

Edit: На основе комментарий Янь ниже, я пытался добавить

ViewController* mainController = (ViewController*) self.window.rootViewController; 
[mainController LoadWebpage]; 

Вместо [self.ViewController loadWebpage]; но это только заканчивается отладка с lldb?

+0

I т hink вы имели в виду писать self.viewController, дайте мне знать, если это работает. – Yan

+0

Это не работает в любом случае. Автозаполнение также не имеет «viewcontroller» с любой капитализацией. – user4279803

+0

Проверьте этот вопрос http://stackoverflow.com/questions/10015567/how-do-i-access-my-viewcontroller-from-my-appdelegate-ios Ответ показывает, как получить доступ к корневому viewController – Yan

ответ

5

Вместо того, чтобы пытаться заставить AppDelegate что-то отключить в вашем контроллере просмотра, я бы предложил иметь регистр View Controller для получения уведомления при запуске приложения. Затем вы можете проверить переменную, которую вы устанавливаете в AppDelegate, и соответственно реагировать.

Например:

YourViewController.m:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // This notification is sent the first time the app launches 
    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(applicationBecameActive:) 
               name: UIApplicationDidBecomeActiveNotification 
               object: nil]; 

    // This notification is sent when the app resumes from the background 
    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(applicationEnteredForeground:) 
               name: UIApplicationWillEnterForegroundNotification 
               object: nil]; 
} 
+1

Спасибо. Это было гораздо лучшее решение, чем я стрелял. – user4279803

+0

Перед iOS 6 (?) Вам нужно было добавить наблюдателя в viewWillAppear и удалить наблюдателя в viewWillDisappear (в случае, если представление было выгружено). Когда вызывается openURL, viewWillAppear не вызывается (это ожидаемое поведение). Просто интересно, какой шаблон будет в тот день, когда нам нужно было удалить наблюдателя? –

1

Для тех, которые хотят его в Swift!

Во-первых, создать NotificationCenter пост метод (В Swift 2.0 - NSNotification Center), где вы хотите отправить данные:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NOTIFICATION_NAME"), object: nil) 

    return true 
} 

В классе ViewController, где вы хотите получить данные, добавьте следующее super.viewDidLoad():

NotificationCenter.default.addObserver(self,selector: #selector(self.YOUR_METHOD_NAME), 
name: NSNotification.Name(rawValue: "NOTIFICATION_NAME"), 
object: nil) 

И метод, который вы хотите позвонить:

func YOUR_METHOD_NAME(notification: NSNotification) { 
    // Your method calling, or what you want to do with received data 
} 
Смежные вопросы