2013-06-21 5 views
0

Преамбула: Я работаю с некоторым кодом, который я не писал, и у меня нет знаний об iOS.проверить, соответствует ли строка любому значению в массиве?

Приложение имеет веб-представление, которое обрабатывает большую часть приложения; внутренние ссылки загружаются в 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-адресов. Мой единственный выбор - добавлять константы «или» и «строка»? Или есть способ сделать массив и сказать «если он соответствует любому из них»? Извините, если этот вопрос кажется упрощенным.

В PHP я бы просто сделать что-то вроде in_array('string', $array) как мое состояние, я думаю, что я ищу, как сделать это в прошивкой

+0

Список уникальных строк или просто посмотреть, существует ли он и добавить его в один? Извините, я сейчас немного читаю это ... У обоих из них уже есть ответы, я укажу вам правильный каталог –

ответ

2

Одним из решений будет поддерживать NSSet объектов, будучи все строки которые вы хотите обрабатывать в своем внутреннем веб-просмотре.

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

Используйте изменяемый набор, если вы будете добавлять к набору в течение долгого времени, но вы, вероятно, знаете, какие ссылки вы хотите обрабатывать внутри, как только ваш начинается приложение, и это не изменится. Если вы добавляете наборы при запуске приложения, добавьте их в изменяемый набор, когда они станут известны.

Когда вы проверяете URL-адрес, используйте [internalURLSet containsObject:urlToTest], и он будет соответствовать любой из строк, добавленных в набор.

Проверка на комплект очень эффективна. Добавление объектов в набор меньше, но вы, скорее всего, добавите URL-адреса в набор только один раз, пока вы будете проверять много раз.

(Doing indexOfObject: против NSArray очень неэффективен ...)

-1

Вы можете сделать это путем создания NSArray ваших URLS, а затем с помощью метода indexOfObjectPassingTest:, чтобы проверить свой адрес от каждого из них в массиве. Это будет выглядеть примерно так:

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

+1

Ответы с кодом = отличные ответы. Ответы только с ссылками = плохие ответы при разрыве ссылок. http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers – iwasrobbed

+0

Но поощрение поиска ответов, а не полагаться на форум - +1. .. извините, меньше 2 зол и студент, который не будет искать google, потому что он «слишком хорош в общении», чтобы быть понятым, повлиял на этот комментарий –

0

Я вижу вашу проблему. В IOS нет функции in_array ('string', $ array), чтобы проверить, что строка содержится в массиве. У меня есть предложение: вы создаете массив со всеми URL-адресами. И реализовать цикл «for» или «while», чтобы получить значение массива, проверить его. Если это то же самое, вы вызываете функцию OpenUrl.

Смежные вопросы