序言:我正在使用一些我没有编写的代码,而且我对 iOS 几乎一无所知。
应用程序有一个 webview 来处理应用程序的大部分内容;内部链接在 webview 中加载,其他网站的链接在 Safari 中打开,这是预期的。然而,嵌入谷歌地图也会导致Safari打开。我找到了相关的 Controller 代码,我想,它看起来像这样:
// 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;
}
这也有效。但我需要添加更多网址。我唯一的选择是继续添加“or”和字符串常量吗?或者有没有办法制作一个数组并说“如果它与其中任何一个匹配”?抱歉,如果这个问题看起来过于简单。
在 PHP 中,我只会做类似 in_array('string', $array)
作为我的条件,我想我正在寻找如何在 iOS 中执行此操作
最佳答案
一种解决方案是维护一个 NSSet 对象,其中包含您想要在内部 Web View 中处理的所有字符串。
NSSet *internalURLSet = [NSSet setWithObjects:@"http://my.example.com", @"http://maps.google.com", nil];
如果您要随着时间的推移向集合中添加内容,请使用可变集合,但您可能会在应用程序启动后立即知道要在内部处理哪些 URL,并且这一点不会改变。如果您在应用程序运行时添加集合,那么当它们变得已知时将它们添加到可变集合中。
当您检查 URL 时,请使用 [internalURLSet containsObject:urlToTest]
,它将匹配您添加到集合中的任何字符串。
对照集合进行检查非常有效。将对象添加到集合中的情况较少,但您很可能在多次检查时只将 URL 添加到集合中一次。
(对 NSArray 执行 indexOfObject:
效率非常低...)
关于iphone - 检查字符串是否与数组中的任何值匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225905/