Dowemo


Question:

It's trivial to make hyperlinks clickable in a UITextView. You just set the "detect links" checkbox on the view in IB, and it detects http links and turns them into hyperlinks.

However, that still means that what the user sees is the "raw" link. RTF files and HTML both allow you to set up a user-readable string with a link "behind" it.

It's easy to install attributed text into a text view (or a UILabel or UITextField, for that matter.) However, if that attributed text includes a link, the link is not clickable.

Is there a way to make user-readable text clickable in a UITextView, UILabel, or UITextField?

The markup is different on SO, but here is the general idea. What I want is text like this:

This morph was generated with Face Dancer, Click to view in the app store.

The only thing I can get is this:

This morph was generated with Face Dancer, Click on http://example.com/facedancer to view in the app store.


Best Answer:


I found this really useful but I needed to do it in quite a few places so I've wrapped my approach up in a simple extension to NSMutableAttributedString:

Swift

import Foundation



extension NSMutableAttributedString {



   public func setAsLink(textToFind:String, linkURL:String) -> Bool {



       let foundRange = self.mutableString.rangeOfString(textToFind)


       if foundRange.location != NSNotFound {


           self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)


           return true


       }


       return false


   }


}


Example usage:

let attributedString = NSMutableAttributedString(string:"I love stackoverflow!")


let linkWasSet = attributedString.setAsLink("stackoverflow", linkURL: "http://stackoverflow.com")



if linkWasSet {


    // adjust more attributedString properties


}


Objective-C

I've just hit a requirement to do the same in a pure Objective-C project, so here's the Objective-C category.

@interface NSMutableAttributedString (SetAsLinkSupport)



- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL;



@end



@implementation NSMutableAttributedString (SetAsLinkSupport)



- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL {



     NSRange foundRange = [self.mutableString rangeOfString:textToFind];


     if (foundRange.location != NSNotFound) {


         [self addAttribute:NSLinkAttributeName value:linkURL range:foundRange];


         return YES;


     }


     return NO;


}



@end


Example usage:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:"I love stackoverflow!"];



BOOL linkWasSet = [attributedString setAsLink:@"stackoverflow" linkURL:@"http://stackoverflow.com"];



if (linkWasSet) {


    // adjust more attributedString properties


}





Copyright © 2011 Dowemo All rights reserved.    Creative Commons   AboutUs