iOS 7中的UITextView链接检测

时间:2013-09-23 15:07:52

标签: ios objective-c ios6 uitextview ios7

我有一个UITextView,它通过Interface Builder进行管理。作为数据检测,我检查了“链接”。在iOS 6中,一切正常,链接突出显示且可点击。但是在iOS 7中,所有链接仍然只是纯文本。未选中可编辑和可选择的复选框。

可能引起关注的是UITextView是容器视图的子视图,它再次位于UIScrollView内。

17 个答案:

答案 0 :(得分:67)

似乎在iOS 7中链接检测仅在UITextView可选时才有效。因此,使UITextView无法选择可以阻止链接检测工作。

我还在iOS 6中对此进行了测试,我可以确认在iOS 6中链接检测工作正常,即使UITextView无法选择。

答案 1 :(得分:32)

我今天在电话号码检测方面遇到了一些问题。在将文本设置为其他内容之后,UITextView似乎会保留旧的电话号码并保持文本突出显示。

我发现如果在将文本设置为新字符串之前将setText:nil设置为nil,则会重置textview,并且电话号码会正常突出显示。我想知道这是否是iOS 7.0中UITextView的某种错误

无论哪种方式,这对我都有用。

答案 2 :(得分:27)

当iOS7第一次出现时,这困扰了我,我在这个帖子中找到了答案(在设置实际值之前将UITextView的text属性设置为nil)。突然之间,问题(对我而言,整个字符串被突出显示为链接)被重新裁剪(假设是由于iOS更新)。

最后我的诀窍是停止使用text属性并设置attributedText。一旦我这样做,需要设置字体/滚动/可选/可编辑/等。以编程方式,消失了。我在IB中定义了我的UITextView,设置了我想要的值(不可滚动,不可编辑,可选择,检测链接和电话号码),然后构建了一个属性字符串并设置:

myUITextView.attributedString = myAttributedString;

突然一切都按预期工作了。希望这有助于其他人在路上。

答案 3 :(得分:18)

我遇到了同样的问题,并且在UITextView上禁用滚动会激活加载时的链接检测,而不是仅在用户与textview交互后才能工作。 UITextView也必须是可选择的且不可编辑的。

detailTextView.scrollEnabled = NO;
detailTextView.editable = NO;
detailTextView.selectable = YES;

在iOS6上不需要可选择或启用滚动。

要检查的另一件事是在单元格的单元格和内容视图上启用了用户交互,否则该链接将无法点击。

答案 4 :(得分:14)

检查必须添加这些行以使用textview单元格中UItableView的数据检测器属性。

    txtvwMsgText.userInteractionEnabled = YES;
    txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink;
    txtvwMsgText.scrollEnabled = NO;
    txtvwMsgText.editable = NO;
    txtvwMsgText.selectable = YES;

答案 5 :(得分:8)

您应该查看NSDataDetector

您可以使用它来查找和处理不同的数据(链接,电话号码等)。看看这个网站:

http://nshipster.com/nsdatadetector/

您还可以使用dataDetectorTypes的{​​{1}}属性设置要在代码中检测的内容。可能只是你的故事板过渡问题。

UITextView

答案 6 :(得分:7)

请注意,如果无法修改,您的textview将仅识别链接!

这是一个很好的教程,介绍如何使用`link detection``

制作editable UITextView

Editable UITextView with link detecion

从现在开始,我没有遇到任何问题。

诀窍是 GestureRecognizer 转发触摸并启用/禁用编辑。

您可以对selectable / not selectable

上的iOS7问题应用相同的内容

答案 7 :(得分:5)

经过几次测试,我找到了解决方案。

如果您希望链接处于活动状态且未启用选择,则需要编辑gestureRecognizers。

例如 - 有3个LongPressGestureRecognizers。一个用于单击链接(minimumPressDuration = 0.12),第二个用于放大可编辑模式(minimumPressDuration = 0.5),第三个用于选择(minimumPressDuration = 0.8)。此解决方案删除了​​LongPressGestureRecognizer以进行选择,第二个用于缩放编辑模式。

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)。 我希望它有所帮助! :)

答案 8 :(得分:4)

我发现了这个技巧,这适用于iOS 7!

您必须在xib中以编程方式设置UITextView

self.yourTextView.selectable = YES;

然后你必须禁用滚动并在设置文本后再次启用。

self.yourTextView.scrollEnabled = NO;
[self.yourTextView setText:contentString];
self.yourTextView.scrollEnabled = YES;

答案 9 :(得分:4)

因此使用UITextView保持启用,可选,不可滚动&amp;可检测的链接并不像看起来那么简单。我在iOS 8中遇到过这种情况。所以我的解决方案是在viewDidLoad中执行类似的操作,然后在textBox编辑完成时将editable属性设置为NO(通常是像doneIsTapped这样的方法)。这里的技巧是在将文本值设置为textview完成后将可编辑属性设置为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中启用了链接。此外,我建议不要在此时使用故事板(或直到苹果修复此问题)并且只使用代码以避免任何不必要的混淆。希望这有帮助。

答案 10 :(得分:2)

在类似的设置中,取消激活UITextViews滚动功能对我来说很有用。

答案 11 :(得分:2)

将色调颜色更改为其他颜色实际上有效。 但是,如果可选择启用,则色调也将是相同的颜色。

答案 12 :(得分:1)

使UITextView的滚动属性为否。它将起作用... Self.textView.ScrollingEnable = NO;

答案 13 :(得分:0)

此解决方法适用于我:

textView.selectable = YES;
textView.delegate = self;

- (void) textViewDidChangeSelection:(UITextView *)textView;
{
    NSRange range = NSMakeRange(NSNotFound, 0.0);
    if ( range.length && !NSEqualRanges(range, textView.selectedRange) ) {
        textView.selectedRange = range;
    }
}

答案 14 :(得分:0)

如果您以编程方式添加UITextview,只需添加以下行:

        _textView.userInteractionEnabled = YES;
        _textView.dataDetectorTypes = UIDataDetectorTypeLink;
        _textView.scrollEnabled = NO;
        _textView.editable = NO;

这对我有用。

答案 15 :(得分:0)

以上都不适合我,而是我这样做了:

[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];
[self.textView.setTextColor:[UIColor whiteColor]];
[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];

我用我的textview做了这个,它应该检测所有类型,并且将未检测到的颜色设置为白色。您可以更改代码以表示要检测的正确颜色和链接类型。

答案 16 :(得分:0)

虽然这个帖子已经老了,但我没有看到一个对Swift有用的答案,所以这里适用于Swift 2.2

textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.selectable = true