1. ホーム
  2. アイオス

[解決済み】NSAttributedStringでクリック可能なリンクを作成するにはどうすればよいですか?

2022-04-22 10:39:56

質問

の中でハイパーリンクをクリックできるようにするのは簡単なことです。 UITextView . IBでビューに "detect links" チェックボックスを設定するだけで、HTTPリンクを検出し、ハイパーリンクに変えてくれます。

しかし、それでもユーザーが目にするのは"raw"リンクということになります。RTFファイルやHTMLでは、ユーザーが読める文字列を設定し、その後ろにリンクを設定することができます。

属性付きテキストをテキストビューに設置するのは簡単です(あるいは UILabel または UITextField ということです)。しかし、その属性付きテキストにリンクが含まれている場合、クリックすることはできません。

の中で、ユーザーが読めるテキストをクリック可能にする方法はありますか? UITextView , UILabel または UITextField ?

SOではマークアップが異なりますが、大まかな内容は以下の通りです。私が欲しいのは、このようなテキストです。

このモーフは フェイスダンサー クリックするとアプリストアで表示されます。

これしかないんです。

このモーフはFace Dancerで生成されたものです。 http://example.com/facedancer をクリックすると、アプリストアでご覧いただけます。

解決方法は?

これは本当に便利なのですが、かなり多くの場所でこれを行う必要があったので、私のアプローチを簡単な拡張機能で包んで NSMutableAttributedString :

スウィフト3

extension NSMutableAttributedString {

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

        let foundRange = self.mutableString.range(of: textToFind)
        if foundRange.location != NSNotFound {
            self.addAttribute(.link, value: linkURL, range: foundRange)
            return true
        }
        return false
    }
}

スウィフト2

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

使用例です。

let attributedString = NSMutableAttributedString(string:"I love stackoverflow!")
let linkWasSet = attributedString.setAsLink("stackoverflow", linkURL: "http://stackoverflow.com")

if linkWasSet {
    // adjust more attributedString properties
}

オブジェクティブC

ちょうど純粋なObjective-Cのプロジェクトで同じことをしたいという要件にぶつかったので、Objective-Cのカテゴリを紹介します。

@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

使用例です。

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

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

if (linkWasSet) {
    // adjust more attributedString properties
}

NSTextFieldのBehavior属性がSelectableに設定されていることを確認します。