2012-01-12 44 views
70

Tôi có một số UILabel có văn bản tôi nhận được từ máy chủ. Một số văn bản được xác định là liên kết và khi chạm vào các liên kết đó, một số hành động sẽ được thực hiện. ví dụ.UILabel - chuỗi dưới dạng văn bản và liên kết

NSString * str = @ "Số điện thoại của tôi là 645-345-2345 và địa chỉ của tôi là xyz";

Đây là văn bản hoàn chỉnh cho UILabel. Tôi chỉ có một UILabel để hiển thị văn bản này (Văn bản động. Tôi vừa đưa ra một ví dụ.). Khi nhấp vào các liên kết này, tôi cần thực hiện các thao tác như điều hướng đến một số màn hình khác hoặc thực hiện cuộc gọi.
Tôi biết rằng tôi có thể hiển thị văn bản như vậy với sự trợ giúp của OHAttributedLabel. Và các liên kết có thể được hiển thị như sau:

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

Nhưng tôi tự hỏi làm thế nào tôi có thể làm cho các văn bản liên kết thực hiện một số hành động như chuyển hướng tới màn hình khác nhau hoặc thực hiện cuộc gọi.
Hãy cho tôi biết nếu cần thêm giải thích.

+1

Từ năm 2013 trở đi ... bạn chỉ cần sử dụng UITextView và nhấp vào "phát hiện liên kết" trong interfaceBuilder ... nó thật đơn giản. – Fattie

+0

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

+0

Bản sao có thể có của [Tạo liên kết có thể nhấn "trong NSAttributedText của UILabel?] (Http://stackoverflow.com/questions/1256887/create-tap-able-links-in-the-nsattributedtext-of-a-uilabel) – NAlexN

Trả lời

129

Bạn có thể thêm hành động tùy chỉnh với bất kỳ có sẵn UILabel thay thế có hỗ trợ liên kết sử dụng một giả chương trìnhURL rằng bạn sẽ đánh chặn sau:

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

Sau đó, trong TTTAttributedLabelDelegate của bạn:

- (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 là một ngã ba của OHAttributedLabel.

Nếu bạn muốn có cách tiếp cận phức tạp hơn, hãy xem Nimbus Attributed Label. Nó hỗ trợ liên kết tùy chỉnh out-of-the-box.

+4

Chỉ cần thêm vào đây: url tùy chỉnh sẽ cần phải có '//' như 'action: // show-help'. Nếu không, lược đồ sẽ là thuộc tính url hợp lệ duy nhất. (mọi thứ khác sẽ không có dấu gạch chéo kép). – Dima

+1

Thanksssssssss !!! :) SO MUCH – KarenAnne

+0

Cảm ơn rất nhiều, tôi đã làm cho nhãn được gán và chèn liên kết vào phạm vi đặc biệt. Nhưng tôi không thể thay đổi kích thước phông chữ của nó. Xin vui lòng giúp đỡ. –

3

Bạn có thể sử dụng nút tùy chỉnh để cung cấp cho một cái nhìn như liên kết ..Also bạn có thể thêm cử chỉ trên nhãn tùy chỉnh nếu bạn không muốn sử dụng nút ..

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

Tôi phải sử dụng nhãn duy nhất. Tôi không thể đặt một nút ở đó. – Nitish

+0

Bạn có thể giải thích lựa chọn thứ hai của mình không. Nó có thể hữu ích ở đây. – Nitish

+0

Vấn đề là các liên kết ở các vị trí khác nhau trên nhãn. Các vị trí là năng động. Cách tiếp cận này có thể phù hợp với tôi như thế nào? – Nitish

6

Có một dự án có tên FancyLabel đó là về những gì bạn cần. Nó có thể cần một số tùy biến mặc dù. Ngoài ra, tôi nghĩ rằng Three20 có chức năng này, nhưng nó có thể là quá mức cần thiết nếu bạn chưa sử dụng.

Ngoài ra còn có một giải pháp đơn giản hơn nhiều, nếu tất cả các liên kết của bạn là điện thoại \ địa chỉ \ url. Bạn có thể chỉ cần sử dụng một UITextView thay vì một UILabel. Nó có chức năng tự động của điện thoại, địa chỉ, vv (chỉ cần kiểm tra các hộp trong IB)

Bạn cũng có thể đã hành động tùy chỉnh để đáp ứng với kích sự kiện vào các liên kết bằng cách ghi đè openURL, như được giải thích here

Có một lý do cụ thể mà bạn phải sử dụng một UILabel thay vì một UITextView? Lưu ý rằng rất nhiều việc triển khai các nhãn được phân bổ kế thừa từ UIView hoặc không triển khai tất cả chức năng của UILabel.

9

Dự án của tôi đã sử dụng thành công OHAttributedLabel cho việc này. Kiểm tra các phương pháp

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

trong OHAttributedLabelDelegate (link). Nó cho phép bạn quyết định điều gì sẽ xảy ra khi một liên kết được nhấp vào. Nếu bạn nhìn vào nguồn cho the example from the OHAttributedLabel project, nó được sử dụng để hiển thị một cảnh báo. Nếu bạn trả lại NO trong trường hợp này (để giữ hành động mặc định xảy ra), bạn chỉ có thể làm bất cứ điều gì bạn muốn điều hướng, v.v.

Lưu ý rằng điều này yêu cầu bạn có thể xác định hành động chính xác ngay từ văn bản . Đối với dự án của chúng tôi, chúng tôi đã sử dụng một giải pháp hơi fancier, nơi máy chủ gửi cho chúng tôi văn bản có thẻ trong đó và danh sách các lệnh để thực hiện cho mỗi thẻ.

18

Bạn có thể sử dụng UITextView với số Điện thoại và phát hiện liên kết CÓ, di chuyển đã tắt Đã bật tương tác người dùng CÓ, thay vì UILabel.

+0

Từ năm 2013 trở đi .. nó đơn giản này là – Fattie

+1

@Ganesh, tại sao cuộn bị vô hiệu? – brainjam

2

Tôi không phải là một fan hâm mộ bị buộc phải sử dụng UITextView hoặc một lib bên thứ ba khi tất cả tôi cần là một nhãn nhẹ mà ám liên kết (và đó nói với tôi khi họ đang khai thác!)

Dưới đây là của tôi thử ở phân lớp hạng nhẹ UILabel có thể phát hiện các liên kết. Cách tiếp cận này khác với cách tiếp cận khác mà tôi đã thấy ở chỗ nó có quyền truy cập vào số NSLayoutManager được chia sẻ của UILabel thông qua cuộc gọi lại đại biểu được thêm vào NSTextStorage qua tiện ích mở rộng danh mục. Vẻ đẹp là UILabel thực hiện bố cục và bản vẽ gốc của nó - các thay thế khác UILabel thường tăng thêm hoặc thay thế hành vi gốc bằng NSLayoutManager/NSTextContainer bổ sung.

Có lẽ Cửa hàng ứng dụng an toàn, nhưng hơi dễ vỡ - hãy tự chịu rủi ro!

https://github.com/TomSwift/TSLabel

+0

Nó không có phát hiện tự động. –

0

Nếu bạn không muốn để mang lại một sự phụ thuộc mới - đó là có thể cấu hình tiêu chuẩn UILabel để hiển thị liên kết và thực hiện các hành động tùy chỉnh cho họ. Hãy xem this câu trả lời StackOverflow của tôi.

Các vấn đề liên quan