web-dev-qa-db-ja.com

UILabel-テキストおよびリンクとしての文字列

サーバーからテキストを取得しているUILabelがあります。一部のテキストはリンクとして識別され、それらのリンクに触れると、何らかのアクションが実行される必要があります。例えば.

NSString * str = @ "私の電話番号は 645-345-2345 で、私のアドレスは xyz ";

これは、UILabelの完全なテキストです。このテキストを表示するためのUILabelは1つだけです(テキストは動的です。例を挙げただけです)。これらのリンクをクリックすると、別の画面に移動したり、電話をかけるなどのアクションを実行する必要があります。
OHAttributedLabelを使用してこのようなテキストを表示できることを知っています。また、リンクは次のように表示できます。

[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]];  

しかし、これらのテキストリンクを使用して、別の画面へのナビゲーションや呼び出しなどのアクションを実行するにはどうすればよいでしょうか。
詳細な説明が必要かどうかを教えてください。

71
Nitish

fakeURLスキームを使用して、リンクをサポートする使用可能なUILabel置換のいずれかにカスタムアクションを追加できます。後で傍受すること:

TTTAttributedLabel *tttLabel = <# create the label here #>;
NSString *labelText = @"Lost? Learn more.";
tttLabel.text = labelText;
NSRange r = [labelText rangeOfString:@"Learn more"]; 
[tttLabel addLinkToURL:[NSURL URLWithString:@"action://show-help"] withRange:r];

次に、TTTAttributedLabelDelegateで:

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url {
    if ([[url scheme] hasPrefix:@"action"]) {
        if ([[url Host] hasPrefix:@"show-help"]) {
            /* load help screen */
        } else if ([[url Host] hasPrefix:@"show-settings"]) {
            /* load settings screen */
        }
    } else {
        /* deal with http links here */
    }
}

TTTAttributedLabel はOHAttributedLabelのフォークです。

より複雑なアプローチが必要な場合は、 Nimbus Attributed Label をご覧ください。すぐに使用できるカスタムリンクをサポートします。

130
djromero

UILabelの代わりに、UITextViewを電話番号とリンクの検出で使用し、スクロールを無効にし、ユーザー対話を有効にします。

18
Ganesh

私のプロジェクトでは、このためにOHAttributedLabelを使用しています。をチェックしてください

-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;

OHAttributedLabelDelegateのメソッド( link )。リンクがクリックされたときに何が起こるかを決定できます。 OHAttributedLabelプロジェクトの例 のソースを見ると、アラートの表示に使用されます。この場合にNOを返した場合(デフォルトのアクションが発生しないようにするため)、ナビゲーションなどのように何でもできます。

ただし、これには、テキストだけでアクションを正しく判断できることが必要です。このプロジェクトでは、サーバーがタグと各タグに対して実行するコマンドのリストを含むテキストをサーバーから送信する、少し手の込んだソリューションを使用しました。

9

FancyLabel というプロジェクトがあり、それはあなたが必要としているものです。ただし、カスタマイズが必要な場合があります。また、 Three2 にはこの機能があると思いますが、まだ使用していない場合はやり過ぎかもしれません。

すべてのリンクが電話\アドレス\ URLである場合は、はるかに簡単なソリューションもあります。 UILabelの代わりにUITextViewを使用するだけです。電話、住所などの自動検出があります(IBのボックスをチェックするだけです)

here のように、openURLをオーバーライドすることにより、これらのリンクのクリックイベントに応答してカスタムアクションを設定することもできます。

UITextViewの代わりにUILabelを使用する必要がある特定の理由はありますか?属性付きラベルの実装の多くは、UIViewを継承するか、UILabelのすべての機能を実装しないことに注意してください。

6
adamsiton

私が必要とするのは、リンクをレンダリングする軽量ラベルだけで、UITextViewやサードパーティのライブラリを使用することを強制されるのは好きではありません(リンクがタップされたときに通知します!)

リンクタップを検出できる軽量のUILabelサブクラスでの私の試みです。このアプローチは、カテゴリ拡張を介してUILabelに追加されたデリゲートコールバックを介してNSLayoutManagerの共有NSTextStorageにアクセスするという点で、他のアプローチとは異なります。美しさは、UILabelがネイティブのレイアウトと描画を実行することです。他のUILabelの置換は、多くの場合、ネイティブの動作を追加のNSLayoutManager/NSTextContainerで補強または置換します。

おそらくApp Storeは安全ですが、多少脆弱です-ご自身の責任で使用してください!

https://github.com/TomSwift/TSLabel

3
TomSwift

リンクのように見えるカスタムボタンを使用できます。また、ボタンを使用したくない場合は、カスタムラベルにジェスチャーを追加できます。

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)];
// if labelView is not set userInteractionEnabled, you must do so
[labelView setUserInteractionEnabled:YES];
[labelView addGestureRecognizer:gesture];
3
Ali3n