我有一个UILabel
我从服务器获取的文字。一些文本将被标识为链接,并且在触摸这些链接时应该执行一些操作。例如
NSString * str = @“我的电话号码为645-345-2345,我的地址为xyz”;
这是UILabel
的完整文字。我只有一个UILabel
用于显示此文本(文本是动态的。我只是举了一个例子。)。点击这些链接后,我需要执行操作,例如导航到某个不同的屏幕或拨打电话
我知道我可以在 OHAttributedLabel 的帮助下显示这样的文字。链接可以显示如下:
[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]];
但我想知道如何让这些文字链接执行某些操作,例如导航到不同的屏幕或拨打电话。
如果需要更多解释,请告诉我。
答案 0 :(得分:130)
您可以使用以后会拦截的伪 网址,为支持链接的任何可用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。它支持开箱即用的自定义链接。
答案 1 :(得分:18)
您可以使用UITextView电话号码和链接检测是,滚动禁用是启用用户交互是,而不是UILabel。
答案 2 :(得分:9)
我的项目已成功使用OHAttributedLabel。查看
-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;
OHAttributedLabelDelegate
(link)中的方法。它允许您决定单击链接时会发生什么。如果您查看the example from the OHAttributedLabel project的来源,它会用于显示提醒。如果您在这种情况下返回NO
(为了防止默认操作发生),您可以随意执行任何操作,例如导航等。
但请注意,这要求您只需从文本中正确确定操作即可。对于我们的项目,我们使用了一个稍微更有趣的解决方案,其中服务器向我们发送带有标签的文本以及要为每个标签执行的命令列表。
答案 3 :(得分:6)
有一个名为FancyLabel的项目就是你所需要的。它可能需要一些定制。 另外,我认为Three20具有此功能,但如果您尚未使用它,则可能是一种过度杀伤。
如果您的所有链接都是phone \ addresses \ urls,那么还有一个更简单的解决方案。您只需使用UITextView而不是UILabel即可。它具有自动检测电话,地址等功能(只需选中IB中的方框)
您可以通过覆盖openURL来响应点击这些链接上的活动而执行自定义操作,如here所述
是否有特定原因必须使用UILabel而不是UITextView? 请注意,很多属性标签的实现都是从UIView继承的,或者没有实现UILabel的所有功能。
答案 4 :(得分:3)
您可以使用自定义按钮来显示链接。如果您不想使用按钮,也可以在自定义标签上添加手势..
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];
答案 5 :(得分:3)
我不是被迫使用UITextView
或第三方lib的粉丝,因为我只需要一个轻量级标签来呈现链接(并告诉我他们什么时候被点击!)
这是我对轻量级UILabel
子类的尝试,可以检测链接点击。该方法与我见过的其他方法不同,它可以通过类别扩展名添加到UILabel
的委托回调来访问NSLayoutManager
的共享NSTextStorage
。美妙之处在于UILabel
执行其原生布局和绘图 - 其他UILabel
替换通常使用额外的NSLayoutManager
/ NSTextContainer
来扩充或替换原生行为。
可能App Store安全,但有点脆弱 - 使用风险自负!