2013-06-21 2 views
0

머리말 : 필자는 작성하지 않은 코드로 작업 중이며 iOS에 대한 지식이 없습니다.문자열이 배열의 어떤 값과도 일치하는지 확인 하시겠습니까?

앱에는 대부분의 앱을 처리하는 webview가 있습니다. 내부 링크가 webview에로드되고 다른 사이트에 대한 링크가 예상되는 Safari에서 열립니다. 그러나 Google지도를 포함 시키면 사파리가 열립니다. 내가 생각하기에, 그것은 다음과 같습니다, 관련 컨트롤러 코드를 발견하기 때문에

// a bit higher up 
static NSString *const siteURL = @"http://my.example.com" 


if (![request.URL.absoluteString hasPrefix:siteUrl]) 
{ 
    if ([[UIApplication sharedApplication] canOpenURL:request.URL]) 
    { 
     [[UIApplication sharedApplication] openURL:request.URL]; 
    } 
    return NO; 
} 

지금 'maps.google.com'로 시작하지 않는 'my.example.com'는 사파리에게 농장 - 그건 나에게 의미가있다. 그러나 이것을 수정 해 보았습니다.

static NSString *const googleMaps = @"http://maps.google.com" 

if (! ([request.URL.absoluteString hasPrefix:siteUrl] || [request.URL.absoluteString hasPrefix:googleMaps])) 
{ 
    if ([[UIApplication sharedApplication] canOpenURL:request.URL]) 
    { 
     [[UIApplication sharedApplication] openURL:request.URL]; 
    } 
    return NO; 
} 

이것은 또한 작동합니다. 하지만 URL을 더 추가해야합니다. '또는'및 문자열 상수를 계속 추가하는 유일한 방법입니까? 아니면 배열을 만들고 "이것들과 일치하는 경우"라고 말하는 방법이 있습니까? 죄송합니다.이 질문은 단순한 것처럼 보입니다.

난 그냥 내 조건으로 in_array('string', $array) 뭔가를 할 거라고 PHP에서

, 나는 내가 모든 문자열,

+0

고유 한 문자열 목록 또는 존재하는지 확인하고 하나에 추가하십시오. 죄송합니다, 저는이 순간을 반 독서 중입니다 ... 둘 다 이미 해답을 가지고 있습니다, 바로 당신에게 가리킬 것입니다 –

답변

2

한 가지 해결책은 개체의 NSSet을 유지하는 것입니다 아이폰 OS에서이 작업을 수행하는 방법을 찾고있는 것 같아 내부 웹보기에서 처리하기를 원합니다.

NSSet *internalURLSet = [NSSet setWithObjects:@"http://my.example.com", @"http://maps.google.com", nil]; 

사용하면 시간이 지남에 따라 세트에 추가 될 것입니다하지만 당신은 아마 당신이 내부적으로 즉시 앱을 시작으로 처리 할하는 URL 알이 변경되지 않을 경우 변경 가능한 설정. 앱을 실행할 때 세트를 추가하는 경우 변경 될 수있는 세트에 알려진 세트가 추가됩니다.

URL을 확인할 때 [internalURLSet containsObject:urlToTest]을 사용하면 세트에 추가 한 모든 문자열과 일치합니다.

세트를 확인하는 것이 매우 효율적입니다. 집합에 개체를 추가하는 것은 그다지 어렵지는 않지만 여러 번 검사하는 동안 URL에 집합을 한 번만 추가하는 것이 좋습니다.

-1

당신은 배열의 각 하나에 대한 URL을 테스트 할 indexOfObjectPassingTest: 방법을 사용하여 다음, URL의있는 NSArray를 생성하고이 작업을 수행 할 수의 (a있는 NSArray에 대한 indexOfObject:을하는이 ... 매우 비효율적이다). 다음과 같이 바뀝니다.

NSArray *testURLs = @[ @"http://maps.google.com", @"http://www.example.com" ]; 

NSString *urlString = request.URL.absoluteString; 
BOOL urlMatchedTest = NO; 
for (NSString *testURL in testURLs) { 
    if [urlString hasPrefix:testURL]) { 
     urlMatchedTest = YES; 
    } 
} 
if (urlMatchedTest){ 
    // the url contains one of the test URLS 
} else { 
    // it didn't match any of the test URLs 
} 
+0

이것이 NSSet의 목적입니다. – Idles

0

술어를 사용해 볼 수 있습니다. 여기에 예제와 튜토리얼 링크입니다 (오래된,하지만 여전히 작동합니다) :

http://arstechnica.com/apple/2009/04/cocoa-dev-the-joy-of-nspredicates-and-matching-strings/

너무 .NET 개발을 많이 할 항상 내가 다시 아이폰 OS에 갈 때 LINQ를 그리워. 술어는 모든 종류의 검색을 수행 할 수 있기 때문에 조금 더 많은 코드 라인을 사용하지만 편리합니다.

+1

코드에 대한 답변 = 훌륭한 답. 링크만으로 응답 = 링크가 끊어 질 때 잘못된 응답. – iwasrobbed

+0

하지만 포럼에 의존하기보다는 답을 찾는 것에 대한 격려는 +1입니다. .. 죄송합니다, 덜 악의적 인 2 명의 악과 그가 "너무 의사 소통하기에 너무 좋기 때문에 google을 검색하지 않을 학생은이 코멘트에 영향을 미쳤다. –

0

문제가 있습니다. IOS에서는 문자열을 검사하기위한 in_array ('string', $ array) 함수가 배열에 포함되어 있지 않습니다. 제안 : 모든 URL을 가진 배열을 만듭니다. 그리고 'for'또는 'while'루프를 구현하여 배열의 값을 얻습니다. 같은 경우 함수 OpenUrl을 호출합니다.

관련 문제