重复方法问题

时间:2013-05-24 00:21:40

标签: ios objective-c methods syntax

我对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的后退按钮,通过一起避免这种方法?我想我可能会犯这个错误。

3 个答案:

答案 0 :(得分: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;
    }
}

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

答案 1 :(得分: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。听起来这就是你想要的,但很难理解你的解释。

答案 2 :(得分:1)

我一般情况下,您可以考虑在方法中使用附加条件来确定要使用的条件树。 这可能是在这一个中调用的另一种方法。 如果需要一些标准来确定方法中的条件逻辑,您还可以考虑向方法参数添加其他参数。 另一个选择,如果你有两个方法由于它们做不同的事情而无法合并,但它们具有相同的参数列表,你应该更改选择器(方法签名)以区分它们并确保选择器指示它们以不同方式执行的操作。

相关问题