2013-05-24 2 views
0

Я очень новичок в Objective-C и синтаксисе и обо всем. Я написал два отдельных метода, но столкнулся с ошибкой: Duplicate declaration of method webView:shouldStartLoadWithRequest:navigationType: Итак, похоже, мне нужно объединить оба моих метода webView:shouldStartLoadWithRequest:navigationType:. Единственная проблема заключается в том, что они содержат как утверждения, так и возвращаемые значения, и это смущает меня. Эти два метода:Duplicate Method Issue

- (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-адреса, избегая этого метода вместе? Я думаю, что, возможно, я ошибаюсь.

+0

Ваши цели кажутся противоречивыми. В одной функции вы возвращаете «YES», когда видите «ExampleURL.com», но в другой функции вы возвращаете «НЕТ», когда видите «ExampleURL.com». Какой ты хочешь? –

+1

На простом английском языке, какова ваша желаемая логика, когда веб-просмотр начинает загружаться, потому что эти 2 реализации противоречат друг другу. –

+0

@AlexWayne Моя желаемая цель - загрузить только определенные URL-адреса. В то же время мне нужно, чтобы кнопка «Назад» была скрыта только при загрузке одного веб-сайта. – John

ответ

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, а затем разрешить только определенный набор URLS для загрузки. Похоже, это то, чего вы хотите, но трудно понять ваше объяснение.

+0

Ты мужчина Эрик! Это полностью сработало! – John

+0

Без проблем приятель-пролетел! –

3

Какая у вас желаемая логика? Один метод будет вызываться, когда WebView начнет загрузку. Вы сделаете что-нибудь, затем верните YES или NO на основании того, хотите ли вы, чтобы загрузка продолжалась. Вы, , не можете сказать, что это нормально загружать, а затем сказать, что это не нормально загружать одновременно.

В ваших двух методов у вас есть это:

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; 
    } 
} 

Теперь настроить, что отражает логику вы на самом деле хотите.

+0

Огромное спасибо вам за ваш ответ Алекс, невероятно подробный и полезный. Моя желаемая цель - загрузить только определенные URL-адреса. В то же время мне нужно, чтобы кнопка «Назад» была скрыта только при загрузке одного веб-сайта. Я приму участие в этом, ссылаясь на код, который вы написали, но это далеко над моей головой. Я все еще учусь, когда иду. Еще раз спасибо! – John

+0

Знаете ли вы, есть ли способ скрыть/показать кнопку «Назад» на основе URL-адреса, избегая этого метода вместе? Я думаю, что я ошибаюсь. – John

+1

Если вы хотите принять действие, основанное на том, что url хочет начать загрузку, это метод, которым вы это сделаете. Просто поймите, что вы делаете 2 вещи одним способом, изменяете состояние приложения (скрываете кнопку «Назад» или нет) и решаете, нужно ли загружать URL (возвращая «ДА» или «НЕТ»). И вы делаете обе эти вещи одним способом. Просто убедитесь, что 'return' как на концах, так как это завершит выполнение метода. –

1

В общем случае вы можете рассмотреть дополнительное условие внутри метода, чтобы определить, какое дерево условий использовать. Это может быть другой метод, называемый внутри этого. Вы также можете рассмотреть возможность добавления дополнительного аргумента к параметрам метода, если вам нужен какой-либо критерий для определения условной логики внутри метода. Другой вариант, если у вас есть два метода, которые нельзя объединить, потому что они выполняют разные вещи, но они имеют один и тот же список аргументов, вы должны изменить селекторы (подпись метода), чтобы отличить их и убедиться, что селектор указывает, что они делают по-другому.

+0

Хороший совет, спасибо. Я абсолютно не знаю, как это сделать, я все еще довольно новичок, но я буду исследовать! – John

+0

В принципе, это называется рефакторинг. Поскольку один метод может вызвать другой метод, всегда полезно попытаться уточнить поток. Постарайтесь сохранить код, который вы видите как можно более кратким, чтобы понять его блок. Если он становится слишком длинным или сложным в одном методе или функции, обычно хорошо провести время, чтобы разбить его на другие методы или функции. Это требует практики и понимания кода других людей. Я рекомендую книгу Стивена Кочана по программированию в Objective-C. – uchuugaka