59

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

可能值得关注的是,它UITextView是容器视图的子视图,它又位于UIScrollView.

4

17 回答 17

70

在 iOS 7 中,链接检测似乎仅在UITextView可选择的情况下才有效。因此,使我的UITextView不可选择停止了链接检测的工作。

我还在 iOS 6 中对此进行了测试,我可以确认在 iOS 6 中链接检测工作正常,即使在UITextView不可选择的情况下也是如此。

于 2013-09-24T10:33:24.033 回答
32

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

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

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

于 2013-09-23T20:54:13.730 回答
26

当 iOS7 第一次出现时,这困扰着我,我在这个线程中找到了答案(在设置实际值之前将 UITextView 的 text 属性设置为 nil 就可以了)。然后突然间,问题(对我来说是整个字符串被突出显示为链接)突然出现(假设是由于 iOS 更新)。

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

myUITextView.attributedString = myAttributedString;

突然间,一切都按预期工作了。希望这可以帮助其他人。

于 2013-12-18T22:02:14.560 回答
18

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

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

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

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

于 2013-10-25T23:39:05.023 回答
16

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

    txtvwMsgText.userInteractionEnabled = YES;
    txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink;
    txtvwMsgText.scrollEnabled = NO;
    txtvwMsgText.editable = NO;
    txtvwMsgText.selectable = YES;
于 2015-05-11T09:25:15.267 回答
8

你应该检查一下NSDataDetector

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

http://nshipster.com/nsdatadetector/

您还可以使用 的dataDetectorTypes属性UITextView来设置要在代码中检测的内容。对你来说可能只是一个故事板过渡问题。

textView.dataDetectorTypes = UIDataDetectorTypeLink;
于 2013-09-23T15:11:28.760 回答
7

请注意,如果不可编辑,您的文本视图只会识别链接!

这是一个关于如何editable UITextView使用“链接检测”制作的不错的教程

带有链接检测的可编辑 UITextView

从现在开始,我在使用该解决方案时没有遇到任何问题。

诀窍是一个GestureRecognizer forwaring touches 和启用/禁用编辑。

selectable / not selectable您可以对问题应用相同的内容iOS7

于 2013-10-15T06:44:45.990 回答
6

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

如果您希望链接处于活动状态并且不希望启用选择,则需要编辑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)。我希望它有帮助!:)

于 2015-11-10T16:51:07.663 回答
4

我找到了诀窍,这适用于 iOS 7!

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

self.yourTextView.selectable = YES;

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

self.yourTextView.scrollEnabled = NO;
[self.yourTextView setText:contentString];
self.yourTextView.scrollEnabled = YES;
于 2013-12-02T17:25:46.513 回答
4

因此,使用 UITextView 使其保持启用、可选择、不可滚动和可检测的链接并不像看起来那么简单。我在 iOS 8 中遇到了这个问题。所以我的解决方案是在 viewDidLoad 中执行类似的操作,然后在 textBox 编辑完成时将可编辑属性设置为 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 中启用了链接。另外我建议此时不要使用故事板(或者直到苹果解决了这个问题),而只使用代码来避免任何不必要的混淆。希望这有帮助。

于 2015-08-22T19:27:07.393 回答
2

在类似的设置中,停用 UITextViews 滚动功能对我有用。

于 2013-10-25T13:09:56.450 回答
2

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

于 2013-10-29T08:47:34.900 回答
1

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

于 2014-02-07T14:16:09.953 回答
1

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

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

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

于 2015-01-29T01:28:09.163 回答
1

虽然这个线程很旧,但我没有看到对 Swift 有用的答案,所以这里适用于 Swift 2.2

textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.selectable = true
于 2016-08-22T15:59:52.337 回答
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;
    }
}
于 2014-11-22T20:37:16.783 回答
0

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

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

这对我有用。

于 2015-01-13T12:35:54.887 回答