2012-06-29 7 views
8

Ich habe versucht Cleaver zu verwenden, das ist PhoneGap/Cordova als Komponente einer bestehenden iOS-Anwendung. Ich folgte this step by step guide zweimal, ohne Erfolg.Cleaver (PhoneGap/Cordova als Komponente) funktioniert nicht unter iOS

Meine Anwendung kann leicht eine Webansicht instanziieren, und ich kann Inhalt mit der Methode stringbyevaluatingjavascriptfromstring übergeben, aber sobald ich versuche, auf PhoneGap API (navigator.compass, navigator.network, ...) zuzugreifen, scheint nichts zu funktionieren. console.log(navigator) zeigt keine Anzeichen von Cordova-Objekten (console.log gibt nichts aus Xcode ist, verwende ich http://debug.phonegap.com/). Das Ereignis deviceready wird ebenfalls nicht ausgelöst.

In meiner HTML-Datei, ich schließe PhoneGap js Datei cordova-1.7.0rc1.js, die ich von einem anderen Projekt kopiert (seit /www Ordner fehlt, wenn Sie PhoneGap als Komponente verwenden).

Meine ViewController.h importiert <Cordova/CDVViewController.h>. Hier mein ViewController.m

// 
// ViewController.m 
// CordovaComponent 
// 

#import "ViewController.h" 

@interface ViewController(){ 
    CDVViewController *cdvViewController ; 
} 
@end 

@implementation ViewController 

- (void)pushPhoneGap:(id)sender { 

    cdvViewController = [[CDVViewController alloc] init]; 
    cdvViewController.wwwFolderName = @"www"; 
    cdvViewController.startPage = @"index.html"; 
    cdvViewController.view.frame = self.view.bounds; 
    cdvViewController.webView.delegate = self; 
    [self.navigationController pushViewController:cdvViewController animated:YES]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [button setTitle:@"Push PhoneGap view" forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(pushPhoneGap:) forControlEvents:UIControlEventTouchUpInside]; 
    button.frame = CGRectMake(60, 50, 200., 50.); 
    [self.view addSubview:button]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    NSString *jsReturn = [cdvViewController.webView stringByEvaluatingJavaScriptFromString:@"setArray([1, 1, 2, 3, 5, 8, 13, 21, 34, 1]);"]; 
    NSLog(jsReturn); 
} 

@end 

Haben Sie eine Vorstellung davon, was passiert? Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Okay, nachdem ich viele Stunden versucht habe, dieses Problem zu lösen, habe ich endlich herausgefunden, was schief gelaufen ist. Das ist die Linie, die Dinge vermasselt:

cdvViewController.webView.delegate = self; 

Sie können den Delegierten des View-Controller Web-Ansicht nicht nur außer Kraft setzen. Der ursprüngliche Delegat verfügt über einen Instanziierungscode, mit dem PhoneGap ausgeführt werden kann. Überschreibe es nicht und alles wird gut!

+0

Hallo, dann, wenn diese Zeile nicht hinzugefügt wird, kann die Funktion webViewDidFinishLoad nicht ausgelöst werden? – red23jordan

0

Wenn Sie wollen über webview Ereignisse benachrichtigt ohne Cordova zu brechen Sie so etwas wie dies versuchen könnte:

@interface WrappingWebViewDelegate : NSObject <UIWebViewDelegate> 
    @property (nonatomic,retain) id<UIWebViewDelegate> wrappedDelegate; 
@end 


@implementation WrappingWebViewDelegate 
    - (void)webViewDidStartLoad:(UIWebView*)theWebView { 
     [self.wrappedDelegate webViewDidStartLoad: theWebView]; 
     // your code 
    } 

    // implement all other delegate methods and forward them to the wrapped delegate 
    [...] 
@end 

Verwendung wie folgt aus:

cdvViewController = [[CDVViewController alloc] init]; 
WrappingWebViewDelegate wrappingDelegate = [[WrappingWebViewDelegate alloc] init]; 
wrappingDelegate.wrappedDelegate = cdvViewController.webView.delegate; 
cdvViewController.webView.delegate = wrappingDelegate; 

Ich habe nicht getestet, so dass Sie Sollte vorsichtig sein.

Verwandte Themen