Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 带有地图的UIWebView行为_Iphone_Objective C_Google Maps_Uiwebview - Fatal编程技术网

Iphone 带有地图的UIWebView行为

Iphone 带有地图的UIWebView行为,iphone,objective-c,google-maps,uiwebview,Iphone,Objective C,Google Maps,Uiwebview,我的应用程序中有一个加载移动网站的UIWebView。移动网站有很多不同的链接 其中一个链接将尝试使用谷歌地图加载地图 最初,我遇到了一个问题,用户单击了“地图”链接,因为应用程序将尝试在我的webview中加载地图。这会让用户陷入困境,因为一旦你在webview中加载了地图,就没有回头路了 您返回的唯一方法是强制关闭应用程序,因此这并不理想 然后,我发现其他人也有同样的问题,并按照描述实施了解决方案 这非常有效,现在单击地图链接,它将打开地图应用程序。为了回到原来的应用程序,我只需双击hom

我的应用程序中有一个加载移动网站的UIWebView。移动网站有很多不同的链接

其中一个链接将尝试使用谷歌地图加载地图

最初,我遇到了一个问题,用户单击了“地图”链接,因为应用程序将尝试在我的webview中加载地图。这会让用户陷入困境,因为一旦你在webview中加载了地图,就没有回头路了

您返回的唯一方法是强制关闭应用程序,因此这并不理想

然后,我发现其他人也有同样的问题,并按照描述实施了解决方案

这非常有效,现在单击地图链接,它将打开地图应用程序。为了回到原来的应用程序,我只需双击home按钮,然后在运行的应用程序列表中选择我的应用程序

然而,这带来了另一个问题。当我再次选择我的应用程序时,它会短暂显示返回的内容,然后打开以下弹出窗口:

无论您在那里选择了什么,它都会再次加载地图,但这次是在webview内部,这否定了前面所述的所有工作

这里有人见过这种行为吗?如果有,你知道如何绕过它,这样它甚至不会打开弹出窗口询问你的当前位置吗

更新 添加代码I;我习惯于处理它

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

    // URL Starts with "http://maps?"
    if([[request.URL description] hasPrefix:@"http://maps"]){
        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    }
    // otherwise let the webview deal with the request
    return YES;
}

提前感谢,

您是否在
shouldStartLoadWithRequest:navigationType:
中确定返回
否?地图应用程序何时打开?在我看来,maps应用程序正在打开,而该方法正在返回
YES

if ([[request.URL description] hasPrefix:@"http://maps"]) {
    // open URL in Safari and return NO to prevent UIWebView from load it
    [[UIApplication sharedApplication] openURL:[request URL]];
    return NO;
}

根据您在下面的补充意见,我编辑了此答案,以关注我最初提出的第二个解决方案:

  • 在我的一个应用程序中,我访问了外部网站,在我的故事板中,我创建了一个视图,其中包含一个UIWebView和一个UIButton(返回按钮)。您可以这样做,只需让UIWebView加载您想要的地图,然后从那里开始
.xib的外观如下所示……请特别注意,done按钮是子视图顺序中的最后一个按钮,因此如果需要,它可以位于webview的顶部(是的,webview可以占据superview不动产的100%,按钮可以放在上面;我使用的这个示例应用程序中没有)(并忽略背景图像;在我用来拍摄此屏幕截图的示例应用程序中,它使用在部分透明的webview后面;如果需要,请确保它以.xib视图的子视图顺序出现在第一位,以便它“位于”所有其他子视图后面)

您需要的代码将位于与此.xib关联的视图控制器中,看起来如下所示:

@interface WebGoogleMapInUIWebViewViewController () <UIWebViewDelegate>

@property (nonatomic) int backCount;

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3
@property (readonly, weak, nonatomic) IBOutlet UIWebView *webView;
#else
@property (readonly, unsafe_unretained, nonatomic) IBOutlet UIWebView *webView;
#endif
@end

@implementation WebGoogleMapInUIWebViewViewController

@synthesize webView;

// … UIViewController life-cycle code and all other code goes here …    

#pragma mark - Actions

- (IBAction)done:(id)sender
{
    if (self.webView.canGoBack) // relying on false for a nil webView
        [self.webView goBack];
}

@end
@interface-WebGoogleMapInUIWebViewViewController()
@属性(非原子)int backCount;
#如果需要IPHONE操作系统版本最低版本>IPHONE 4 3
@属性(只读、弱、非原子)ibuiwebview*webView;
#否则
@属性(只读、不安全、未维护、非原子)IBOUTLE UIWebView*webView;
#恩迪夫
@结束
@WebGoogleMapinuIWebViewController的实现
@综合网络视图;
//…UIViewController生命周期代码和所有其他代码位于此处…
#pragma标记-动作
-(iAction)完成:(id)发送方
{
if(self.webView.canGoBack)//对于nil webView依赖false
[self.webView goBack];
}
@结束
此解决方案应允许您停留在应用程序内部,然后如果您进入询问位置的对话框,结果应立即生效,并仅在应用程序内部应用


我知道这并不能像你所说的那样解决问题,但它可能会给你想要的行为。

我倾向于同意SurfDev,它听起来像是返回了是。如果不是,那么根据你提供的数据,没有人能给你真正的答案

就我个人而言,我会记录WebView试图访问的每个URL。我最好的猜测是,不知何故,第二次尝试访问地图站点时会触发,而这次URL略有不同


底线是,NSLog可以获取更多关于webview正在做什么的数据。如果有必要,你可以使用它的每一个回调语句。

我100%返回否。我已经在问题上发布了我的代码,以便你可以看到。我不确定我是否理解你的意思。我的应用程序是一个移动网站,可以加载谷歌地图,所以我不会想要更改移动网站。虽然我可以更改移动应用程序,但请您在这里举例说明一下好吗?在这种情况下,您最好选择第二个选项:在您的代码中的视图控制器(或故事板或xib)如果您有您提到的
UIWebView
,您也可以选择一个按钮;将它放在最后一个顺序将使它显示在您的webview的“顶部”。然后,在代码中,在前面提到的视图控制器中,为该按钮实现一个iAction,该按钮将调用
[webview goBack]
。因此,当用户准备离开地图时,他们可以点击您提供的后退按钮,并最终进入您原来的移动网站webView。这听起来是正确的方式。您能否为我提供一个如何实现这一点的示例?我的意思是,我有一个想法,但正如我所说,我不是一个真正的IoS开发人员,一个nd在这里举个例子可能对其他人也有帮助。非常感谢。我还没有实现这个,但从我的阅读来看,这似乎是正确的。你得到了赏金:-)