2012-06-13 64 views
5

我目前在UITableViewCell中使用UITextView爲了使鏈接可點擊,但是這給了非常差的性能。在NSString中檢測URL

所以我想知道是否有可能檢測到NSString中的鏈接,如果有鏈接,請使用UITextView,否則只需使用UILabel

+0

可能你可以在NSString中檢查'http',如果它包含,那麼它是鏈接。 – rishi

+0

@ rishi,問題是,有許多類型的網址,UITextView似乎檢測到他們所有,所以google.com,www.google.com,... –

回答

14

絕對如此。使用NSDataDetector(NSDataDetector Class Reference

+0

哇,這工作完美,很容易,這樣做使用與UITextView使用相同的「正則表達式」? –

+3

這個API的另一個有用的文章是http://www.nshipster.com/nsdatadetector/。 – AdamG

2

我猜你所熟悉的正則表達式來檢測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; 
} 
+1

我真的不熟悉正則表達式,特別是不在Objective-C中,因此這裏的問題 –

+0

感謝這個例子,使用2個自定義單元格,還是隻使用一個,但添加UITextView和UILabel它,然後刪除其中之一? –

+0

是的,我只是將它們添加到IB中,並用代碼刪除它們,在我的情況下,我將不得不進行檢查以設置行高 –

1

使用這個代碼剪斷你就能夠找到和使用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)];