【问题标题】:UITextView link detection in iOS 7iOS 7 中的 UITextView 链接检测
【发布时间】:2013-09-28 13:19:52
【问题描述】:

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

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

【问题讨论】:

标签: ios objective-c ios6 uitextview ios7


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    虽然这个帖子很旧,但我没有看到适合我使用 Swift 的答案,所以这里适用于 Swift 2.2

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

    【讨论】:

      【解决方案3】:

      因此,使用 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 中启用。另外我建议此时不要使用故事板(或者直到苹果解决了这个问题),而只使用代码来避免任何不必要的混淆。希望这有帮助。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

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

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

            这对我有用。

            【讨论】:

              【解决方案7】:

              此解决方法对我有用:

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

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                • 在 iOS7.0.2 和 Xcode5 上,当我通过情节提要检查 UITextView 上的可选和链接时,链接检测工作。但是,当我在 tableview 上的 UITableViewCell 上设置 textview 并快速滚动时,它会因为未捕获的异常“NSRangeException”而崩溃,原因是:“NSMutableRLEArray objectAtIndex:effectiveRange:: Out of bounds”。我发现当我不检查情节提要上的链接检测时不会发生崩溃。
                • 我还发现,除非我以编程方式设置字体大小,否则通过故事板对 UITextView 的链接检测会出错。奇怪..
                • 这同样适用于 iOS8(.1)。更糟糕的是:如果我选择了不可编辑、不可选择和电话号码检测,应用程序将立即崩溃。知道如何进行电话号码检测,如果未检测到电话号码,则不允许选择内容?
                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

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

                  myUITextView.attributedString = myAttributedString;
                  

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

                  【讨论】:

                  • 这是唯一对我有用的解决方案。从 7.0.4 开始,其他解决方案似乎都不再起作用了。
                  • 太棒了!这正是我所需要的——所有其他解决方案都不起作用?但这确实做到了。谢谢!
                  • 添加我的发现,这在 7.1 中似乎也对我有用。非常感谢您解决这个问题。
                  • @Raconteur 你救了我,非常感谢,这是最好的解决方案!
                  • iOS 8.1 Swift,仍然有同样的问题,表格单元格中的 textview 会给出没有链接的随机文本片段的链接。这解决了,谢谢!
                  【解决方案11】:

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

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

                  self.yourTextView.selectable = YES;
                  

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

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

                  【讨论】:

                  • 我不知道这是否真的解决了问题,或者只是通过将 whatsit 插入 whackdoodle 我修复了 thingamajigger。
                  【解决方案12】:

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

                  【讨论】:

                  • 这为我解决了。我的链接工作但不可见。事实证明,您需要将色调颜色设置为适当的颜色,它将用于链接。谢谢德斯蒙德。
                  【解决方案13】:

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

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

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

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

                  【讨论】:

                  • 滚动提示非常棒,谢谢!要获得完整的修复,请将其与 text = nil 结合使用!
                  • 取消选中启用滚动解决了我的问题。谢谢!
                  • 同意@NV。在这三个完美之前添加 text = nil !谢谢
                  【解决方案14】:

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

                  【讨论】:

                    【解决方案15】:

                    请注意,只有在不可编辑的情况下,您的 textview 才会识别链接!

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

                    Editable UITextView with link detecion

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

                    诀窍是一个 GestureRecognizer 预警触摸和启用/禁用编辑。

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

                    【讨论】:

                      【解决方案16】:

                      您应该查看NSDataDetector

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

                      http://nshipster.com/nsdatadetector/

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

                      textView.dataDetectorTypes = UIDataDetectorTypeLink;
                      

                      【讨论】:

                      • 感谢您的回答,但在 iOS 6 中,UITextView 无需额外编码(在 IB 中设置了正确的检测器)就可以做到这一点。那么为什么这在 iOS 7 中不再起作用了呢?
                      • 这就是为什么我想知道是否存在 IB 问题。你更新到使用 Xcode 5 中的新故事板了吗?
                      • 不,我从项目一开始就使用故事板,虽然我在这期间从 Xcode 4 更新到 Xcode 5。
                      • 如果您将子类中的文本视图替换为标准视图。它是否按预期工作?
                      • 不,很遗憾没有。我还尝试使用您建议的代码示例设置检测器类型,但无济于事。
                      【解决方案17】:

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

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

                      不管怎样,这确实对我有用。

                      【讨论】:

                      • 感谢您的回复,但不幸的是,这并没有起到作用。
                      • 这对我也有用。我遇到了文本包含 URL 和电话号码的问题,并且整个文本块已成为文本末尾的电话号码的一个链接。将 text 属性设置为 nil 首先解决了我的问题。谢谢!
                      • 具有讽刺意味的是,我在我正在构建的另一个应用程序中再次遇到了这个问题。将 textview 设置为可编辑,然后立即将其取消设置为可编辑,在 prepareForReuse 方法中似乎比将文本设置为 nil 更好。
                      • 将文本设置为 nil 对我有用。我有一个消息表,当我插入消息时,我会检查字符串中的标签。如果标签在那里,我使用属性文本。我遇到的问题是,如果上一条消息的标签突出显示为蓝色,加载更多消息会使其他消息也变成蓝色,即使它们没有标签。很好的建议!
                      • 将 textView 设置为 nil 或切换可编辑的开关似乎对我来说都不起作用。
                      猜你喜欢
                      • 1970-01-01
                      • 2013-11-24
                      • 2016-07-07
                      • 2013-10-29
                      • 2012-11-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多