0

我对 Objective-C 和语法和一切都很陌生。我写了两个单独的方法,但遇到了错误:Duplicate declaration of method webView:shouldStartLoadWithRequest:navigationType: 所以,看起来我需要结合我的两个webView:shouldStartLoadWithRequest:navigationType:方法。唯一的问题是,它们都包含 if 语句和返回值,这让我非常困惑。这是两种方法:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *full = [request.URL absoluteString];

    if ([full isEqualToString:@"ExampleURL.com"] || [full isEqualToString:@"ExampleURL.com"]
        || [full isEqualToString:@"ExampleURL.com"] ) {

        return YES;
    }
    else
        return NO;    

}

和:

-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *full = [request.URL absoluteString];

    if ([full isEqualToString:@"ExampleURL.com"]) {
        _backButton.hidden = YES;
        return NO;
    } else {
        _backButton.hidden = NO;
    }
    return YES;
}

很长一段时间以来,我一直在尝试将这两种方法合二为一,不知所措。是那些让我绊倒的if陈述。有谁知道我该怎么做或者它会是什么样子?

旁注:我想要的目标是只允许加载特定的 URL。同时,我需要仅在加载一个网站时隐藏后退按钮。有谁知道是否有办法通过完全避免这种方法来隐藏/显示基于 URL 的后退按钮?我想我可能做错了。

4

3 回答 3

3

你想要的逻辑是什么?WebView 开始加载时将调用一种方法。您将做一些事情,然后返回YESNO根据您是否要继续加载。您不能告诉它可以加载,然后告诉它不能同时加载。

在你的两种方法中,你有这个:

if ([full isEqualToString:@"ExampleURL.com"] || ...snipped... ) {
    return YES;
}

然后这个

if ([full isEqualToString:@"ExampleURL.com"]) {
    // ...
    return NO;
}

哪个检查相同的东西,然后返回相反的值。


所以我会笼统地回答。这是这种方法的一般形式。

-(BOOL)                webView:(UIWebView *)webView
    shouldStartLoadWithRequest:(NSURLRequest *)request
                navigationType:(UIWebViewNavigationType)navigationType
{
    // alter application state
    // return YES or NO
}

假设你想这样做,我不确定你想要什么,但这是一般的想法:

  • 如果加载 ExampleURL.com,则显示后退按钮并允许加载
  • 否则,隐藏按钮,不允许加载。

然后你可以像这样实现这个方法:

-(BOOL)                webView:(UIWebView *)webView
    shouldStartLoadWithRequest:(NSURLRequest *)request
                navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[request.URL host] isEqualToString:@"ExampleURL.com"]) {
        _backButton.hidden = NO;
        return YES;
    } else {
        _backButton.hidden = YES;
        return NO;
    }
}

现在调整它以反映您实际想要的逻辑。

于 2013-05-24T00:34:04.737 回答
2

我认为你正在尝试做这样的事情:

-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
 navigationType:(UIWebViewNavigationType)navigationType {
    NSString *full = [request.URL absoluteString];

    if([full isEqualToString:@"hidebackbuttonforthiswebsite.com"])
        _backButton.hidden = YES;

    if ([full isEqualToString:@"AcceptedURL1.com"] ||
        [full isEqualToString:@"AcceptedURL2.com"] ||
        [full isEqualToString:@"AcceptedURL3.com"]) 
    {
        // Good URL, load it
        return YES;
    } 
    else 
    {
        // Bad URL, so don't load it
        return NO;
    }
}

这将隐藏特定 URL 的后退按钮,然后只允许加载一组特定的 URL。听起来这就是你想要的,但很难理解你的解释。

于 2013-05-24T03:17:09.920 回答
1

一般来说,您可能会考虑在方法中添加一个附加条件来确定要使用的条件树。这可能是在这个方法中调用的另一种方法。如果您需要一些标准来确定方法内的条件逻辑,您还可以考虑向方法参数添加一个附加参数。另一种选择,如果您有两个方法因为它们做不同的事情而无法合并,但它们具有相同的参数列表,您应该更改选择器(方法签名)以区分它们并确保选择器指示它们的不同之处。

于 2013-05-24T00:49:02.603 回答