UILabel – string作为文本和链接
我有一个从服务器获取文本的UILabel
。 有些文本被认定为链接,在触摸这些链接时,应该执行一些操作。 例如
NSString * str = @“我的电话号码是645-345-2345 ,我的地址是xyz ”;
这是UILabel
的完整文本。 我只有一个UILabel
来显示这个文本(文本是dynamic的,我只是举了一个例子)。 在点击这些链接时,我需要执行一些操作,例如导航到某个不同的屏幕或拨打电话。
我知道我可以在OHAttributedLabel的帮助下显示这样的文本。 链接可以显示如下:
[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]];
但我不知道如何使这些文本链接执行一些行为,如导航到不同的屏幕或拨打电话。
让我知道是否需要更多的解释。
您可以将自定义操作添加到任何可用的UILabel
replace项中,这些replace项将使用稍后拦截的假 URLscheme来支持链接:
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标签” 。 它支持自定义链接开箱即用。
您可以使用UITextView和电话号码和链接检测YES,滚动禁用YES是否启用用户交互YES,而不是UILabel。
我的项目成功地使用了OHAttributedLabel。 看看
-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;
方法在OHAttributedLabelDelegate
( 链接 )。 它允许您决定单击链接时发生的情况。 如果您从OHAttributedLabel项目中查看示例的源代码,则会使用它来显示警报。 如果你在这种情况下返回NO
(为了保持默认行为不发生),你可以做任何你想要的东西,如导航等。
但请注意,这要求您可以从文本中正确地确定操作。 对于我们的项目,我们使用了一个稍微更有趣的解决scheme,服务器向我们发送带有标签的文本以及每个标签执行的命令列表。
有一个名为FancyLabel的项目就是你所需要的。 可能需要一些定制。 另外,我认为Three20有这个function,但是如果你还没有使用它,可能会是一个矫枉过正的问题。
如果您的所有链接都是电话\地址\url,那么还有一个更简单的解决scheme。 您可以简单地使用UITextView而不是UILabel。 它具有自动检测电话,地址等(只需在IB中勾选)
您还可以通过覆盖openURL来执行自定义操作,以响应这些链接上的单击事件,如此处所述
是否有一个特定的原因,你必须使用UILabel而不是UITextView? 请注意,许多属性标签的实现inheritance自UIView或不实现所有UILabel的function。
你可以使用自定义button看起来像链接..也可以在自定义标签上添加手势,如果你不想使用button..
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];
我不是被迫使用UITextView
或第三方库的粉丝,当我需要的是一个呈现链接的轻量级标签(并且告诉我它们何时被点击!)
这是我的尝试在一个轻量级的UILabel
子类能够检测链接水龙头。 这种方法与我见过的其他方法不同,它通过一个通过类扩展添加到NSTextStorage
的委托callback来访问UILabel
的共享NSLayoutManager
。 UILabel
执行其原生布局和绘图的美妙之处在于 – 其他UILabel
replace通常用一个额外的NSLayoutManager
/ NSTextContainer
来增加或取代本地行为。
可能App Store安全,但有些脆弱 – 使用风险自负!
如果您不想引入新的依赖关系,可以将标准UILabel
configuration为显示链接并为其执行自定义操作。 看看我的StackOverflow答案。