我目前正在使用 aUITextView
以UITableViewCell
使链接可点击,但这会带来非常糟糕的性能。
所以我想知道是否可以检测 aNSString
中的链接,如果有链接,请使用UITextView
,否则只需使用 a UILabel
。
我目前正在使用 aUITextView
以UITableViewCell
使链接可点击,但这会带来非常糟糕的性能。
所以我想知道是否可以检测 aNSString
中的链接,如果有链接,请使用UITextView
,否则只需使用 a UILabel
。
绝对地。使用 NSDataDetector(NSDataDetector 类参考)
我猜你熟悉正则表达式来检测 URL,所以为了在你的单元格中获得一种或另一种类型的视图,你可以简单地UITableViewCell
从你的tableView:cellForRowAtIndexPath:
方法中返回两个不同的 s。
它可能看起来像这样(请注意,在未测试的浏览器中输入):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *dataString = // Get your string from the data model
// Simple pattern found here: http://regexlib.com/Search.aspx?k=URL
NSString *URLpattern = @"^http\\://[a-zA-Z0-9\-\.]+\\.[a-zA-Z]{2,3}(/\\S*)?$";
NSError *error = NULL;
NSRegularExpression *URLregex = [NSRegularExpression regularExpressionWithPattern:URLpattern
options:NSRegularExpressionCaseInsensitive
error: &error];
NSUInteger numberOfMatches = [URLregex numberOfMatchesInString:string
options:0
range:NSMakeRange(0, [string length])];
if ( numberOfMatches == 0 ) {
static NSString *PlainCellIdentifier = @"PlainCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
}
cell.textLabel.text = timeZoneWrapper.localeName;
}
else {
static NSString *FancyCellIdentifier = @"FancyCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
}
// Configure cell view with text view here
}
return cell;
}
使用这段代码,您将能够使用 NSDataDetector在 UILable 中找到并获取 http url:
NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
NSArray* matches = [detector matchesInString:yourString options:0 range:NSMakeRange(0, [yourString. length])];
NSLog(@"%@",matches) ;
NSMutableAttributedString *MylabelAttributes =
[[NSMutableAttributedString alloc] initWithString:yourString];
for (int index = 0 ; index < matches.count; index ++) {
NSTextCheckingResult *textResult = [matches objectAtIndex : index];
NSTextCheckingType textResultType = textResult.resultType;
NSRange testRange = textResult.range;
NSURL *testUrl = textResult.URL ;}
After applying this code, you will be able to attribute your `UILabel` text:
[MylabelAttributes addAttribute:NSLinkAttributeName value:testUrl range: testRange];
[MylabelAttributes addAttribute:NSFontAttributeName
value:[UIFont boldSystemFontOfSize:7.0]range:NSMakeRange(0,yourString.length)];