2012-06-13 22 views
5

Şu anda UITableViewCell numaralı telefondan UITextView numaralı telefonu kullanıyorum. Bağlantıları tıklatılabilir yapmak için kullanıyorum, ancak bu çok düşük performans veriyor.NSString'de Algılama URL'si

NSString numaralı bağlantıdaki bağlantıları algılamanın mümkün olup olmadığını ve bir bağlantı varsa UITextView kullanın, aksi halde yalnızca UILabel kullanın.

+0

Eğer varsa, NSString'de 'http' olup olmadığını kontrol edebilirsiniz. – rishi

+0

@rishi, sorun çok sayıda url var, UITextView hepsini algılar gibi görünüyor, bu yüzden google.com, www.google.com, ... –

cevap

14

Kesinlikle. NSDataDetector (NSDataDetector Class Reference)

+0

Woah, bu mükemmel çalıştı, çok kolay, bu kullanımı UITextView kullanır gibi aynı "regex"? –

+3

Bu API için başka bir faydalı makale http://www.nshipster.com/nsdatadetector/. – AdamG

2

kullanın Ben birini almak ya da hücrede görünümünün diğer tip, sadece tableView:cellForRowAtIndexPath: yönteminden iki farklı UITableViewCell s döndürebilir amacıyla böylece regexes, URL'ler tespit etmek aşina sanırım.

O (fark lütfen, test tarayıcıda yazdığınız) aşağıdaki gibi görünebilir:

- (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

Özellikle regex'lere aşina değilim, özellikle objektif-c'de değil, buradaki soru –

+0

Burada verilen örnekte, 2 özel hücre kullanımı arasında bir fark var mı, yoksa sadece birini kullanıyorsunuz, ancak UITextView ve UILabel'ı ekleyin. o zaman ve bunlardan birini kaldırmak? –

+0

Evet, ben onları IB'ye ekledim ve onları kodla kaldırdım, benim durumumda, satır yüksekliğini ayarlamak için yine de bir kontrol yapmalıydım –

1

bulup NSDataDetector kullanarak UILable yılında http url almak mümkün olacaktır bu kod snip kullanarak:

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)];