我目前在UITableViewCell
中使用UITextView
爲了使鏈接可點擊,但是這給了非常差的性能。在NSString中檢測URL
所以我想知道是否有可能檢測到NSString
中的鏈接,如果有鏈接,請使用UITextView
,否則只需使用UILabel
。
我目前在UITableViewCell
中使用UITextView
爲了使鏈接可點擊,但是這給了非常差的性能。在NSString中檢測URL
所以我想知道是否有可能檢測到NSString
中的鏈接,如果有鏈接,請使用UITextView
,否則只需使用UILabel
。
絕對如此。使用NSDataDetector(NSDataDetector Class Reference)
哇,這工作完美,很容易,這樣做使用與UITextView使用相同的「正則表達式」? –
這個API的另一個有用的文章是http://www.nshipster.com/nsdatadetector/。 – AdamG
我猜你所熟悉的正則表達式來檢測URL,因此,爲了得到一個或你的另一類型來看,你可以簡單地從你的tableView:cellForRowAtIndexPath:
方法返回兩個不同的UITableViewCell
秒。
它看起來是這樣的(請注意,鍵入沒有測試瀏覽器):
- (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;
}
我真的不熟悉正則表達式,特別是不在Objective-C中,因此這裏的問題 –
感謝這個例子,使用2個自定義單元格,還是隻使用一個,但添加UITextView和UILabel它,然後刪除其中之一? –
是的,我只是將它們添加到IB中,並用代碼刪除它們,在我的情況下,我將不得不進行檢查以設置行高 –
使用這個代碼剪斷你就能夠找到和使用NSDataDetector得到HTTP URL在UILable:
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)];
可能你可以在NSString中檢查'http',如果它包含,那麼它是鏈接。 – rishi
@ rishi,問題是,有許多類型的網址,UITextView似乎檢測到他們所有,所以google.com,www.google.com,... –