序言:我正在处理一些我没写过的代码,而我几乎不了解iOS。
该应用有一个webview,可以处理大部分应用;内部链接在webview中加载,并且在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'开头,所以它会用到野生动物园 - 这对我来说很有意义。但是,我尝试修改它:
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中如何做到这一点
答案 0 :(得分:2)
一种解决方案是维护一个NSSet对象,即您希望在内部webview中处理的所有字符串。
NSSet *internalURLSet = [NSSet setWithObjects:@"http://my.example.com", @"http://maps.google.com", nil];
如果您要随着时间的推移添加到集合中,请使用可变集,但是一旦您的应用启动,您可能会知道您想要在内部处理哪些URL,这不会改变。如果您在应用程序运行时添加集合,则将它们添加到可变集中,因为它们已知。
检查网址时,请使用[internalURLSet containsObject:urlToTest]
,它会匹配您添加到网上的任何字符串。
检查集合非常有效。将对象添加到集合中的次数较少,但是当您多次检查时,很可能只将URL添加到集合中。
(针对NSArray做indexOfObject:
效率非常低......)
答案 1 :(得分:0)
您可以尝试使用谓词。这是一个示例的教程链接(较旧,但应该仍然有用):
http://arstechnica.com/apple/2009/04/cocoa-dev-the-joy-of-nspredicates-and-matching-strings/
我做了很多.NET开发,当我回到iOS时总是想念LINQ。由于你可以进行各种搜索,因此谓词可以帮助一些代码,但是很方便。
答案 2 :(得分:0)
我看到了你的问题。在IOS中,没有函数in_array('string',$ array)来检查数组中是否包含字符串。 我有一个建议:你创建一个包含所有网址的数组。并实现'for'或'while'循环以获取数组的值检查它。如果相同,则调用函数OpenUrl。
答案 3 :(得分:-1)
您可以通过创建URL的NSArray,然后使用indexOfObjectPassingTest:
方法针对阵列中的每个URL测试您的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
}