2012-01-12 13 views
70

bağlantılar Ben kimin metin bir sunucudan alıyorum bir UILabel. Metnin bir kısmı link olarak tanımlanmalı ve bu linklere dokunarak bazı eylemler gerçekleştirilmelidir. Örneğin.UILabel - metin olarak dize ve

NSString * str = @ "Telefon numaram 645-345-2345 ve adresim xyz";

Bu UILabel için tam metindir. Bu metni görüntülemek için sadece bir tane UILabel var (Metin dinamik. Sadece bir örnek verdim.). Bu bağlantıları tıklarken, bazı farklı ekranlara gitme veya arama yapma gibi işlemleri gerçekleştirmem gerekiyor.
Ben OHAttributedLabel yardımıyla böyle metni görüntülemek biliyoruz. Ve bağlantılar aşağıdaki gibi gösterilebilir:

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

Ama bu metin farklı ekrana navigasyon veya bir çağrı yapmak gibi bazı eylemi gerçekleştirmek bağlantılar yapabilirsiniz merak ediyorum.
Daha fazla açıklama gerekip gerekmediğini bildirin.

+1

2013'ten itibaren ... UITextView'ı kullanın ve interfaceBuilder'da "bağlantıları tespit et" i tıklayın ... bu kadar basit. – Fattie

+0

http://stackoverflow.com/questions/10116820/how-to-make-customlink-touchable-in-ohattributedlabel – kernix

+0

Olası bir kopya [UILabel'in NSAttributedText'inde "Dokunma oluşturulabilir" linkler "(http://stackoverflow.com/questions/1256887/create-tap-able-links-in-the-nsattributedtext-of-a-uilabel) – NAlexN

cevap

129

Sen sonradan müdahale edeceğiz bir sahteURL şemasını kullanarak bağlantıları destekleyen mevcut UILabel değiştirmeler herhangi birine özel eylemleri ekleyebilir

- (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 bir çataldır.

Daha karmaşık bir yaklaşım istiyorsanız, Nimbus Attributed Label'a bakın. Kutudan özel bağlantıları destekler.

+4

Sadece buna eklemek için: özel URL'nin bir '//' 'action: // show-help' gibi olması gerekir. Aksi halde, şema tek geçerli url özelliği olacaktır. (her şey çift eğik çizgi olmadan sıfır olacaktır). – Dima

+1

Thanksssssssss !!! :) ÇOK YÜKSEK – KarenAnne

+0

Teşekkürler, ben etiket atfedilen ve özel aralığa bağlantıyı ekledim. Ancak yazı tipi boyutunu değiştiremiyorum. Yardım lütfen. –

3
özel etiket üzerindeki hareketini ekleyebilir ..Also düğmesini kullanmak istemiyorum eğer bağlantının gibi bir görünüm vermek için özel bir düğme kullanabilirsiniz

..

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]; 
+0

Sadece tek etiket kullanmalıyım. Orada bir düğme yerleştiremem. – Nitish

+0

İkinci seçeneğinizi açıklayabilir misiniz? Burada yararlı olabilir. – Nitish

+0

Şey, linklerin etiket üzerinde farklı pozisyonlarda olmasıdır. Pozisyonlar dinamik. Bu yaklaşım benim için nasıl çalışır? – Nitish

6

FancyLabel denilen bir proje var İhtiyacın olan şey hakkında. Yine de bazı özelleştirme gerekebilir. Ayrıca, ben Three20 bu işlevselliği olduğunu düşünüyorum, ama zaten bunu kullanmıyorum eğer bir overkill olabilir. adresler URL'ler \ \ tüm bağlantıların telefonlar ise

, ayrıca çok daha basit çözüm yoktur. UILabel yerine bir UITextView kullanabilirsiniz. Bu

mi telefonların otomatik algılama, adres, vb (sadece IB onay kutuları) Ayrıca OpenUrl geçersiz kılarak bu linklere click olaylarına tepki olarak özel eylemleri, here açıkladık gibi

orada vardır UITextView yerine UILabel kullanmanızın belirli bir nedeni nedir? Atıfta bulunulan etiketlerin çoğunun UIView'den miras aldığını veya tüm UILabel işlevlerini uygulamadığını unutmayın.

9

Projem başarıyla bunun için OHAttributedLabel kullandı. OHAttributedLabelDelegate (link) içerisinde

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

yöntemi edin. Bir bağlantı tıklandığında ne olacağına karar vermenizi sağlar. the example from the OHAttributedLabel project kaynağına bakarsanız, bir uyarı görüntülemek için kullanılır. Bu durumda NO döndürdüyse bu sadece metinden doğru harekete belirleyebilir gerektirir ancak bu, sadece vb navigasyon gibi istediğini

Not yapabilirdi (çok varsayılan işlemin gerçekleşmesini tutmak için) . Projemiz için sunucunun bize etiketler içeren metinleri ve her etiket için gerçekleştirilecek komutların listesini gönderdiği biraz meraklı bir çözüm kullandık.senin TTTAttributedLabelDelegate yılında,

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

Sonra:

18

UITextView ile Telefon numaralarını ve bağlantılarını algılamayı kullanabilirsiniz YES, kaydırılabilir devre dışı bırak YES kullanıcı etkileşimi etkin YES, yerine UILabel. İhtiyacım olan tüm bağlantıları kılan hafif etiket olduğunda UITextView veya bir üçüncü taraf lib kullanmak zorunda olmanın bir hayranı değilim

+0

2013'ten itibaren .. bu basit – Fattie

+1

@Ganesh, neden kaydırma devre dışı bırakıldı? – brainjam

2

(ve onlar aday olduğunuzda olduğunu söylüyor!)

İşte benim bağlantı musluklarını algılayabilen bir alt UILabel alt sınıfı girişiminde bulunabilirsiniz. Yaklaşım, 'un ' un NSTextStorage 'a bir kategori uzantısı üzerinden eklenmiş bir temsilci geri bildirimi aracılığıyla erişebildiği diğerlerinden farklıdır. Güzelliği, UILabel'un yerel düzenini ve çizimini gerçekleştirmesidir - diğer UILabel değiştirmeleri genellikle yerel davranışı ek bir NSLayoutManager/NSTextContainer ile artırır veya değiştirir.

Muhtemelen App Store güvenli, ama biraz kırılgan - kendi sorumluluğunuzda kullanın!

https://github.com/TomSwift/TSLabel

+0

Otomatik algılama özelliği yok. –

0

yeni bir bağımlılık getirmek istemiyorsanız - bağlantıları göstermek ve onlar için özel eylemleri gerçekleştirmek için standart UILabel yapılandırmak mümkündür. Benim this StackOverflow cevabını kontrol edin.