2014-11-21 70 views
2

我想從AppDelegate.m中調用ViewController.m中的函數LoadWebpage在URL方案之後從AppDelegate調用ViewController方法OpenURL

我已經啓用我的應用程序的URL計劃,使得「Safari瀏覽器://?查詢字符串」鏈接在Safari打開我的應用程序。我正在捕獲AppDelegate中的url方案(我可以通過記錄這個工作告訴),並且想用查詢字符串填充一個全局變量,然後調用我的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];有錯誤「屬性 '視圖控制器' 不是類型的對象發現「 AppDelegate的'」。

我猜我需要綜合對開放viewcontroller的引用,但我不能找到如何做到這一點的信息。這是處理這個問題的最好方法嗎?

編輯:基於燕的評論下面,我試圖添加

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

而不是[self.ViewController loadWebpage];,但它只是結束調試並LLDB?

+0

餘噸嗨你的意思寫self.viewController讓我知道,如果這有效。 – Yan 2014-11-21 19:22:47

+0

這種方式無效。 auto complete沒有任何大小寫的「viewcontroller」。 – user4279803 2014-11-21 19:24:25

+0

看看這個問題http://stackoverflow.com/questions/10015567/how-do-i-access-my-viewcontroller-from-my-appdelegate-ios答案顯示瞭如何訪問根viewController – Yan 2014-11-21 19:30:37

回答

5

與其試圖讓AppDelegate在你的View Controller中觸發某些東西,我會建議讓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 2014-11-21 20:30:36

+0

在iOS 6(?)之前,您必須在viewWillAppear中添加觀察者,並在viewWillDisappear中移除觀察者(以防視圖被卸載)。當調用openURL時,viewWillAppear不會被調用(這是預期的行爲)。只是想知道在我們不得不移除觀察者的那一天,這種模式會回來嗎? – 2015-04-06 23:31:14

1

對於那些,誰都有希望在斯威夫特!

首先,創建通知中心POST方法(在雨燕2.0 - NSNotification中心),要發送的數據:

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 
} 
相關問題