2011-08-09 18 views
0

私はTTTAttributedLabelを使用してテキスト内のハイパーリンクを検出し、クリック可能にしています。私のコードは機能せず、リンクはクリックできません。実際、すべてがクリック可能です。私は、URLをクリック可能にしたいだけです。ここRegexを使用してhttpリンクを検出できません

が正規表現である:ここでは

static NSRegularExpression *websiteRegularExpression; 
static inline NSRegularExpression * WebsiteRegularExpression() { 
    if (!websiteRegularExpression) { 
     websiteRegularExpression = [[NSRegularExpression alloc] initWithPattern:@"\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[A-Z0-9+&@#/%=~_|]" 
                     options:NSRegularExpressionCaseInsensitive 
                      error:nil]; 
    } 

    return websiteRegularExpression; 
} 

-(void)setBodyText 
{ 
    __block NSRegularExpression *regexp = nil; 
    NSString* labelText = [[message valueForKey:@"body"]gtm_stringByUnescapingFromHTML]; //@"http://www.google.com is a cool website"; 
    [self.bodyLabel setText:labelText afterInheritingLabelAttributesAndConfiguringWithBlock:^NSAttributedString *(NSMutableAttributedString *mutableAttributedString) { 

     NSRange stringRange = NSMakeRange(0, [mutableAttributedString length]); 
     /* regexp = WebsiteRegularExpression(); 
     NSRange nameRange = [regexp rangeOfFirstMatchInString:[mutableAttributedString string] options:0 range:stringRange]; 
     UIFont *boldSystemFont = [UIFont boldSystemFontOfSize:18.0]; 
     CTFontRef boldFont = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL); 
     if (boldFont) { 
      [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)boldFont range:nameRange]; 
      CFRelease(boldFont); 
     } 

     if (nameRange.location != NSNotFound) 
      [mutableAttributedString replaceCharactersInRange:nameRange withString:[[[mutableAttributedString string] substringWithRange:nameRange] uppercaseString]]; 
     return mutableAttributedString; 
     */ 

     regexp = WebsiteRegularExpression(); 
     [regexp enumerateMatchesInString:[mutableAttributedString string] options:0 range:stringRange usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {    
      UIFont *italicSystemFont = [UIFont italicSystemFontOfSize:18.0]; 
      CTFontRef italicFont = CTFontCreateWithName((CFStringRef)italicSystemFont.fontName, italicSystemFont.pointSize, NULL); 
      if (italicFont) { 
       [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)italicFont range:result.range]; 
       CFRelease(italicFont); 

       [mutableAttributedString addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)[[UIColor grayColor] CGColor] range:result.range]; 
      } 
     }]; 

     return mutableAttributedString; 

    }]; 


    regexp = WebsiteRegularExpression(); 
    NSRange linkRange = [regexp rangeOfFirstMatchInString:labelText options:0 range:NSMakeRange(0, [labelText length])]; 
    NSURL *url = [NSURL URLWithString:@"http://www.google.com"]; 
    [self.bodyLabel addLinkToURL:url withRange:linkRange]; 

    [Utils alignLabelWithTop:bodyLabel]; 
} 
+0

最初に、あなたは正規表現にhttpより多くを含んでいて、次に、次のようなものを試してみます: 'https?://。[^] +' – Anders

答えて

5

実装である理由だけではない:myTextView.dataDetectorTypes = UIDataDetectorTypeLink;

+1

内部のカスタムビューコントローラでリンクを開くユーザーをサファリに蹴る代わりに、私のアプリの –

+0

直前: NSRange linkRange = [regexp rangeOfFirstMatchInString:labelTextオプション:0範囲:NSMakeRange(0、[labelText length])]; labelTextが解放されているかどうか確認できますか? labelText文字列がautoreleaseに設定されているように見えるので、範囲を設定するときに消えてしまう可能性があるので、範囲がすべてになります。 –

+1

'dataDetectorTypes'プロパティを使用し、コントローラに' delegate'を設定します。次に、あなたのコントローラで、デリゲートメソッド 'attributedLabel:didSelectLinkWithURL:'を実装して、あなたが望むことを何でもすることができます。 – mattt

関連する問題