iOS 7中的UITextView链接检测

iOS 7中的UITextView链接检测,ios,objective-c,ios6,uitextview,ios7,Ios,Objective C,Ios6,Uitextview,Ios7,我有一个通过Interface Builder管理的UITextView。作为数据检测,我检查了“链接”。在iOS 6中,一切正常,链接突出显示且可点击。但在iOS 7中,所有链接都保持为纯文本。未选中“可编辑”和“可选择”复选框 可能需要注意的是,UITextView是容器视图的子视图,它同样位于UIScrollView中 您应该查看NSDataDetector 您可以使用它查找和处理不同的数据(链接、电话号码等)。请浏览此网站: 您还可以使用UITextView的dataDetectorT

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


可能需要注意的是,
UITextView
是容器视图的子视图,它同样位于
UIScrollView

您应该查看
NSDataDetector

您可以使用它查找和处理不同的数据(链接、电话号码等)。请浏览此网站:

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

textView.dataDetectorTypes = UIDataDetectorTypeLink;

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

我发现,如果在将文本设置为新字符串之前设置text:nil,它将重置textview,电话号码将正常高亮显示。我想知道这是否是iOS 7.0中UITextView的某种缺陷


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

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


我还在iOS 6中测试了这一点,我可以确认,在iOS 6中,链接检测工作正常,即使
UITextView
不可选择。

请注意,只有不可编辑时,您的textview才会识别链接

下面是一个很好的教程,介绍如何使用“链接检测”创建一个
可编辑的UITextView
``

从现在起,我就没有遇到过这种解决方案的任何问题

技巧是一个手势识别器,用于警告触摸和启用/禁用编辑


您可以在
iOS7
上的
可选/不可选问题上应用相同的功能,禁用UITextView滚动功能在类似的设置中对我起到了作用。

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

detailTextView.scrollEnabled = NO;
detailTextView.editable = NO;
detailTextView.selectable = YES;
iOS6上不需要选择或启用滚动


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

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

我发现了窍门,这在iOS 7中有效

必须在xib中或通过编程方式将UITextView设置为可选

self.yourTextView.selectable = YES;
然后,您必须禁用滚动,并在设置文本后再次启用

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

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

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

myUITextView.attributedString = myAttributedString;

突然间,一切都如预期的那样运转起来。希望这对以后的其他人有所帮助。

将UITextView的滚动属性设置为No。它会工作的。。。
Self.textView.ScrollingEnable=否

这个变通方法适合我:

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;
    }
}

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

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

这对我很有效。

以上这些对我都不起作用,而是我这样做了:

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

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

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

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

因此,使用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;
}


这使得在textview中启用了链接。另外,我建议现在不要使用故事板(或者在苹果解决这个问题之前),只使用代码来避免任何不必要的混淆。希望这有帮助

经过几次测试,我找到了解决办法

如果希望链接处于活动状态而不启用选择,则需要编辑手势识别器

例如,有3个LongPressGestureRecognitors。一个用于单击链接(minimumPressDuration=0.12),第二个用于可编辑模式下的缩放(minimumPressDuration=0.5),第三个用于选择(minimumPressDuration=0.8)。此解决方案删除了用于选择的LongPressGestureRecognitor和用于在编辑模式下缩放的second

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;
NSArray*textViewGestureRecognizers=self.captionTextView.gestureRecognizers;
NSMutableArray*MutableArrayOfGetureRecognitors=[[NSMutableArray alloc]init];
用于(文本视图中的UIGestureRecognizer*gestureRecognizer){
如果(![GestureRecognitor是类:[UILon
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;
textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.selectable = true