使用插件更改当前页面

时间:2013-08-22 09:39:56

标签: ios objective-c cordova

我正在使用phonegap。 目前在Android上,我可以使用我所做的非常简单的功能来更改页面:

public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException {
        MainActivity ma = (MainActivity) cordova.getActivity();
        ma.reload(args.getString(0));
        return (true);
    }

并在mainActivity中:

super.loadUrl("file:///android_asset/www/" + url, 1000);

但我是目标C和iO的新手,我无法找到正确的关键词或答案的开头。 我能够拥有等效的execute函数,但后来我不知道如何获取mainActivity并重新加载页面

直到现在我的插件我有以下代码,但它不起作用:/

- (void)execute:(CDVInvokedUrlCommand*)command
{
//id message = [command.arguments objectAtIndex:0];
 id message = @"buy/buy.html";       
 [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:message]]];
}

编辑:

我尝试执行以下操作:

@implementation Redirect

- (void)execute:(CDVInvokedUrlCommand*)command
{
    id message = [command.arguments objectAtIndex:0];

    NSString* newUrl = message;
    NSString* javaScript = nil;
    NSString *jsCallBack = [[NSString alloc] initWithFormat:@"changeUrl('%@');", newUrl];



    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:message];
    javaScript = [pluginResult toSuccessCallbackString:jsCallBack];
    [self writeJavascript:javaScript];
}
@end

并在html中:

 window.changeUrl = function (url){
        alert("ici");
        navigator.app.loadUrl(url);
    }

var Redirect= function(){
    return cordova.exec( function(data){ alert(data);console.log("Success");}, function(){ console.log("Fail");},
                            "Redirect",
                            "execute",
                            [location.href]);
};

我确定插件被调用但是如果我在changeUrl函数中发出警报则没有显示

2 个答案:

答案 0 :(得分:2)

我在插件中找到了一个解决方案:

- (void)execute:(CDVInvokedUrlCommand*)command
{
    id message = [command.arguments objectAtIndex:0];
    AppDelegate* mainDelegate =[[UIApplication sharedApplication]delegate];
    [mainDelegate reloadUrl:message];
}
AppDelegate.m中的

- (void)reloadUrl:(NSString *)url
{
 #if __has_feature(objc_arc)
    self.viewController = [[MainViewController alloc] init];
#else
    self.viewController = [[[MainViewController alloc] init] autorelease];
#endif  

    self.viewController.startPage = url;
    self.window.rootViewController = self.viewController;
    [self.window reloadInputViews];
}

我只是在js中调用插件:

return cordova.exec( function(data){ alert(data);console.log("Success");}, function(){ console.log("Fail");},
                                    "Redirect",
                                    "execute",
                                    ["index2.hmtl"]);

答案 1 :(得分:1)

你可以通过几种不同的方式(我所知道的)这样做。确保两种方法的窗口命名空间中都有changeUrl函数。

第一种方法(这可以从任何地方触发,不必是一个cordova插件类) -

function changeUrl(url){
    navigator.app.loadUrl(url);
}

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSString* newUrl = @"file:///android_asset/www/buy/buy.html";
NSString *jsCallBack = [[NSString alloc] initWithFormat:@"changeUrl('%@');", newUrl];
[appDelegate.viewController.webView stringByEvaluatingJavaScriptFromString:jsCallBack];

第二种方法(必须从cordova插件类触发,这是您当前的代码所在的位置) -

function changeUrl(url){
    navigator.app.loadUrl(url);
}

NSString* newUrl = @"file:///android_asset/www/buy/buy.html";
NSString* javaScript = nil;
NSString *jsCallBack = [[NSString alloc] initWithFormat:@"changeUrl('%@');", newUrl];
javaScript = [pluginResult toSuccessCallbackString:jsCallBack];
[self writeJavascript:javaScript];