我有一个通过Interface Builder管理的UITextView
。在数据检测方面,我已经勾选了“链接”。在iOS 6中,一切都正常工作,链接被突出显示并且可以点击。然而,在iOS 7中,所有链接仍然只是普通文本。可编辑和可选择的复选框未被勾选。
可能需要注意的是,UITextView
是容器视图的子视图,该容器视图再次位于UIScrollView
中。
我有一个通过Interface Builder管理的UITextView
。在数据检测方面,我已经勾选了“链接”。在iOS 6中,一切都正常工作,链接被突出显示并且可以点击。然而,在iOS 7中,所有链接仍然只是普通文本。可编辑和可选择的复选框未被勾选。
可能需要注意的是,UITextView
是容器视图的子视图,该容器视图再次位于UIScrollView
中。
看起来在iOS 7中,只有当可选中UITextView
时链接检测才能正常工作。因此,使我的UITextView
不可选会停止链接检测的工作。
我还在iOS 6中测试过这一点,并确认在iOS 6中,即使UITextView
不可选择,链接检测也能正常工作。
今天在电话号码检测时遇到了一些问题。似乎UITextView在我设置新文本后,仍然保留旧的电话号码并将文本保持高亮显示。
我发现,在设置新字符串文本之前先setText:nil,可以重置textview,并使电话号码正常高亮显示。我想知道这是否是iOS 7.0中UITextView的某种bug。
不管怎样,这对我来说确实起作用了。
iOS7首次推出时,这个问题困扰了我,我在这个帖子中找到了答案(在设置实际值之前将UITextView的文本属性设置为nil就可以解决)。 然后突然间,这个问题又出现了(对我来说,整个字符串都被突出显示为链接),可能是由于iOS更新引起的。
最终让我成功的方法是停止使用文本属性,而是设置attributedText。 一旦我这样做了,编程设置字体/滚动/可选择/可编辑等等的需要就消失了。 我在IB中定义了我的UITextView,并按照所需设置了值(不可滚动、不可编辑、可选择、检测链接和电话号码),然后构建了一个属性字符串并设置:
myUITextView.attributedString = myAttributedString;
突然间,一切都正常工作了。希望这能对其他人有所帮助。
我有同样的问题,禁用UITextView上的滚动会在加载时激活链接检测,而不仅仅是当用户与文本视图交互后才能工作。UITextView还必须是可选择和不可编辑的。
detailTextView.scrollEnabled = NO;
detailTextView.editable = NO;
detailTextView.selectable = YES;
在iOS6中,可选择性或启用滚动并不是必要的。
另一个需要检查的问题是单元格及其内容视图上是否启用了用户交互,否则链接将无法点击。
在UITableView
单元格中使用数据检测器属性,必须添加以下这些行到textview
。
txtvwMsgText.userInteractionEnabled = YES;
txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink;
txtvwMsgText.scrollEnabled = NO;
txtvwMsgText.editable = NO;
txtvwMsgText.selectable = YES;
您应该查看NSDataDetector
。
您可以使用它来查找和处理不同的数据(链接、电话号码等)。请在此网站上查看:
http://nshipster.com/nsdatadetector/
您还可以使用UITextView的dataDetectorTypes属性来设置您想要在代码中检测的内容。对于您来说,可能只是一个故事板转换问题。textView.dataDetectorTypes = UIDataDetectorTypeLink;
请注意,您的textview仅在不可编辑时才能识别链接!
这是一个关于如何制作带有`link detection`的可编辑UITextView
的不错教程。
至今为止我没有遇到任何问题。
这个技巧是使用一个手势识别器GestureRecognizer来转发触摸并启用/禁用编辑。
您可以将同样的方法应用于上的可选/不可选
问题。
经过几次测试,我找到了解决方案。
如果您希望链接处于活动状态,并且不希望选择启用,则需要编辑gestureRecognizers。
例如-有3个LongPressGestureRecognizers。 其中一个用于单击链接(minimumPressDuration = 0.12),第二个用于可编辑模式下的缩放(minimumPressDuration = 0.5),第三个用于选择(minimumPressDuration = 0.8)。 这个解决方案删除了选择和编辑模式下的第二个长按手势识别器。
NSArray *textViewGestureRecognizers = self.captionTextView.gestureRecognizers;
NSMutableArray *mutableArrayOfGestureRecognizers = [[NSMutableArray alloc] init];
for (UIGestureRecognizer *gestureRecognizer in textViewGestureRecognizers) {
if (![gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
[mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
} else {
UILongPressGestureRecognizer *longPressGestureRecognizer = (UILongPressGestureRecognizer *)gestureRecognizer;
if (longPressGestureRecognizer.minimumPressDuration < 0.3) {
[mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
}
}
}
self.captionTextView.gestureRecognizers = mutableArrayOfGestureRecognizers;
已在iOS 9上测试,但应该适用于所有版本(iOS 7、8、9)。 希望能对您有所帮助!:)
使用UITextView来实现启用、可选、不可滚动和可检测链接并不像看起来那么简单。我在iOS 8中遇到了这个问题。所以我的解决方案是在viewDidLoad中做类似以下的操作,然后当文本框编辑完成时将editable属性设置为NO(通常会有一个像doneIsTapped的方法)。关键在于在完成对textview的文本值设置后将editable属性设置为NO。这将使UITextview中的链接生效。
- (void)viewDidLoad
{
[super viewDidLoad];
self.txtViewComment.editable = YES;
self.txtViewComment.selectable = YES;
self.txtViewComment.dataDetectorTypes = UIDataDetectorTypeLink;
self.txtViewComment.scrollEnabled = NO;
}
- (IBAction)doneIsTapped:(id)sender
{
self.txtViewComment.text = @"set text what ever you want";
self.txtViewComment.editable = NO;
}
这样可以使链接在TextView中可用。此外,我建议暂时不要使用故事板(或者在Apple修复此问题之前)只使用代码来避免任何不必要的混乱。希望这能有所帮助。
我找到了诀窍,这在iOS 7中有效!
您需要在xib或编程方式中设置UITextView可选择。
self.yourTextView.selectable = YES;
然后您需要禁用滚动条,设置文本后再重新启用滚动条。
self.yourTextView.scrollEnabled = NO;
[self.yourTextView setText:contentString];
self.yourTextView.scrollEnabled = YES;