Xcode 9中UITextView链接不再可点击

9
在Xcode 9和iOS 11之前,我在UITableViewCell中嵌入了一个包含多个链接的UITextView。每个链接都可以正常工作,但自从升级到iOS 11和Xcode 9之后,这些链接不再起作用。 UITextView似乎无法识别任何与之交互的触摸操作,因此func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool从未被触发。
是否有其他人在升级后遇到了相同的问题?

是的。在iOS11之前,这些设置需要就位才能使链接正常工作。我相信这是iOS11引入的一项更改,导致UITextView不再记录与URL的交互;文本是可选择的。 - user2562126
问题似乎出现在UITextViewDelegate上。UITableViewCell被设置为委托,这是可以的,但现在似乎不起作用了。我通过在单元格中实现func textViewDidBeginEditing(_ textView: UITextView)来测试它,发现它没有被调用,就像interactwithURL一样。如果我将ViewController设置为委托,则该函数将在ViewController中被调用。 - user2562126
代理应该是 UITableViewCell。代理在 override init(style: UITableViewCellStyle, reuseIdentifier: String?) 中设置。 - user2562126
1
我通过在ViewController中实现interactwithURL而不是在UITableViewCell中设置ViewController作为单元格的UITextViewDelegate,成功地使其工作。很高兴听到任何其他更优雅的方法。感谢你的帮助Matt。另外,我注意到链接需要比之前在ios10中需要更坚定的按压才能注册。 - user2562126
你应该回答自己的问题;这是合法和鼓励的,你的答案可能对他人有用。在48小时内,你可以(并且应该)接受自己的答案。——我想知道是否有什么东西出现并使单元格在设置后不再是委托。 - matt
这个问题似乎在iOS 11.2+中已经修复。 - user102008
2个回答

3
原来并没有问题。UITextView在iOS11中对触摸的响应方式发生了改变,这意味着点击链接需要更多的按压而不是之前在iOS10中只需要轻点即可。我认为这可能与iOS11中现在可以按住链接并拖动它们以显示URL详细信息有关。因此,UITextView需要更强的按压才能注册被点击的链接。

2
长按不会与轻触冲突,因此这仍然是一个错误。 - zgjie
是的,这对我来说似乎也是这样。我认为这应该是一个错误,但我猜他们可以称其为“设计意图”/“特性”代替。 - sudoExclaimationExclaimation
1
这个与iOS 11.0和11.1相关的bug已经在iOS 11.2中修复了。 - Cœur

1
在iOS 11.0和11.1中(不是11.2+之后或10.x之前),UITextViewDelegate的textView(_:shouldInteractWith:in:interaction)方法是通过UILongPressGestureRecognizer而不是UITapGestureRecognizer进行交互调用的。
对于这两个iOS版本,用户需要进行小延迟长按,而不是轻触,以获取与UITextView链接的本机交互。
如果对于这两个iOS版本回调根本没有被调用,即使是长按,您可能已经通过子类化UITextView并覆盖gestureRecognizerShouldBegin(_)来混淆手势识别器。
以下是快速解决gestureRecognizerShouldBegin(_)的示例,它将禁用放大镜/放大器的长按(如果覆盖的意图是如此),但仍允许链接长按。
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    if gestureRecognizer is UIPanGestureRecognizer {
        // required for compatibility with isScrollEnabled
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }
    if let tapGestureRecognizer = gestureRecognizer as? UITapGestureRecognizer,
        tapGestureRecognizer.numberOfTapsRequired == 1 {
        // allowing taps for links
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }
    if let longPressGestureRecognizer = gestureRecognizer as? UILongPressGestureRecognizer,
        // allowing small delay long press for links (required for iOS 11.0-11.1)
        // average comparison value is used to distinguish between:
        // 0.12 (smallDelayRecognizer)
        // 0.5 (textSelectionForce and textLoupe)
        longPressGestureRecognizer.minimumPressDuration < 0.325 {
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }
    gestureRecognizer.isEnabled = false
    return false
}

另一种方法是完全禁止使用UILongPressGestureRecognizerUITapGestureRecognizer,除了自己制作的UITapGestureRecognizer外,您需要自己构建来与链接交互。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接