2011-10-05 64 views
4

我正在使用XCode 4開發可可應用程序。其中一個窗口具有選項卡視圖。其中一個標籤應該顯示某個位置的Google地圖。我添加了一個WebView(WebKit框架)到選項卡,並將其定義爲插座,以便我可以使用窗口控制器來操作它。如何將谷歌地圖地圖添加到OS X可可應用程序

我設法使用,以顯示Web視圖中的URL(maps.google.com)以下:

[[mapView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://maps.google.com"]]]; 

然而,這不是我要找的結果。理想情況下,我希望有一個類似於iPhoto的地圖視圖。從this教程我明白你將不得不在服務器上有一個HTML文件來使事情工作。由於我的應用程序是本地OS X應用程序(不涉及任何服務器),所以我想知道是否有任何方法可以做到這一點,並在應用程序的de目錄中擁有HTML本地(不確定這將如何與所需Google Maps API密鑰與URL綁定)?

編輯:

我解決了這一部分。你實際上可以在本地存儲一個HTML文件(我把它放在我的項目的「Supporting Files」文件夾中)。然後,您可以使用下面的代碼訪問此文件:

NSString *pagePath; 
NSBundle *aBundle = [NSBundle mainBundle]; 
pagePath = [aBundle pathForResource:@"test2" ofType:@"html"]; 
// make a file: URL out of the path 
NSURL *pageURL = [NSURL fileURLWithPath: pagePath]; 

下一步是使用顯示在地圖下面:

[[mapView mainFrame] loadRequest:[NSURLRequest requestWithURL: pageURL]]; 

這顯示我的WebView裏面的地圖。作爲起點,我使用了Google Maps API教程here中的示例。這個特殊的例子顯示了一張集中在瑞典斯德哥爾摩的地圖

我還沒有設法解決的一件事是如何訪問顯示地圖的Javascript函數(在上面的例子中是使用body onload調用的initialize()函數)。對於我的情況,我想調整這個函數來接受兩個參數,一個是經度和緯度,然後從顯示地圖的Objective-C對象調用它。據蘋果公司的文檔,可以使用WebScriptObject的一個實例,它是通過的WebView實例訪問從Objective-C的範圍內調用JavaScript:

id wso = [mapView windowScriptObject]; 

然後使用callWebScriptMethod:withArguments:一個人應該能夠執行一個Javascript函數。但是,如果我刪除body標籤的onload並使用WindowScriptInstance調用Javascript initialize()函數,則不會顯示地圖。有人知道我做錯了什麼?

回答

3

拼圖的最後一部分是獲得正確的時機。在WebView完成加載之前,您無法使用Javascript進行任何操作。通過發送webView:didFinishLoadForFrame:到您的控制器,將信號發送回您的控制器。查看WebFrameLoadDelegate協議參考here上的Apple文檔。你的控制器應該實現其中的一些方法,這取決於所需的行爲(協議方法是可選的)。

一旦這個方法被運行,web視圖準備工作,你可以訪問你的Javascript功能在其中:

- (void) webView:(WebView *) webView didFinishLoadForFrame:(WebFrame *) frame { 
    NSArray *args = [NSArray arrayWithObjects: 
        [NSNumber numberWithFloat: 59.325225], 
        [NSNumber numberWithFloat:18.0700], nil]; 

    [[webView windowScriptObject] callWebScriptMethod:@"initialize" withArguments:args]; 
} 

一個很好的參考點是我解剖,以使整個事情的工作CallJS sample app