0

序言:我正在使用一些我没有编写的代码,而且我对 iOS 几乎一无所知。

该应用程序有一个处理大部分应用程序的 web 视图;内部链接在 web 视图中加载,其他站点的链接在 Safari 中打开,这是预期的。但是,嵌入谷歌地图也会导致 safari 打开。我认为我找到了相关的控制器代码,它看起来像这样:

// 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' 开头的,所以它转而用于 safari - 这对我来说很有意义。但是,我尝试修改这个:

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)按照我的条件做一些事情,我想我正在寻找如何在 iOS 中做到这一点

4

4 回答 4

2

一种解决方案是维护对象的 NSSet,即您希望在内部 web 视图中处理的所有字符串。

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

如果您将随着时间的推移添加到集合中,请使用可变集合,但您可能会在应用启动后立即知道要在内部处理哪些 URL,这不会改变。如果您在应用程序运行时添加集合,请在已知时将它们添加到可变集合中。

当您检查 URL 时,使用[internalURLSet containsObject:urlToTest]它会匹配您添加到集合中的任何字符串。

检查集合是非常有效的。将对象添加到集合中的情况较少,但您很可能只会在多次检查时将 URL 添加到集合中一次。

indexOfObject:对一个 NSArray 做是非常低效的......)

于 2013-06-21T00:33:40.223 回答
0

您可以尝试使用谓词。这是一个带有示例的教程链接(较旧,但应该仍然有效):

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

我也做了很多 .NET 开发,当我回到 iOS 时总是想念 LINQ。谓词有助于编写更多代码行,但很方便,因为您可以进行各种搜索。

于 2013-06-21T00:33:55.980 回答
0

我看到了你的问题。在 IOS 中,没有函数 in_array('string',$array) 来检查字符串是否包含在数组中。我有一个建议:你创建一个包含所有 url 的数组。并实现'for'或'while'循环来获取数组的值检查它。如果相同,则调用函数 OpenUrl。

于 2013-06-21T00:42:03.303 回答
-1

您可以通过创建 URLS 的 NSArray 来做到这一点,然后使用该indexOfObjectPassingTest:方法针对数组中的每个测试您的 URL。它会是这样的:

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
}
于 2013-06-21T00:33:50.947 回答