我有一个textView分层在tableView单元格上.我需要用户点击tableView行来打开一个viewController,但是如果textView有一个链接,那么它必须是可点击的,就是它,没有副本,选择等等.
如果我允许这样的用户交互:
textView.userInteractionEnabled=NO; textView.dataDetectorTypes =UIDataDetectorTypeLink;
didSelectRowAtIndexPath没有被调用,我理解为什么但是如何实现这个?
编辑:
我正在寻找的是能够专门识别链接并允许用户点击链接打开浏览器并禁用其他textView的交互.如上所述,整个行也应该是可点击的.
附件是我的tableView单元格行的图像,它显示检测到链接并且也可以进行交互,但这会禁用textView区域内的didSelectRowAtIndexPath.
解决方法
一种可能的(也是复杂的)解决方案是在UITextView中使用带有UITapGestureRecogniser的UIViews.
>首先,您需要找到链接的NSRange.
>将NSRange转换为UITextRange
>使用类似于以下内容的代码在UITextView中的链接文本之上添加UITapGestureRecogniser.
UITextPosition *pos = textView.endOfDocument;// textView ~ UITextView for (int i = 0; i < words*2 - 1; i++){// *2 since UITextGranularityWord considers a whitespace to be a word UITextPosition *pos2 = [textView.tokenizer positionFromPosition:pos toBoundary:UITextGranularityWord inDirection:UITextLayoutDirectionLeft]; UITextRange *range = [textView textRangeFromPosition:pos toPosition:pos2]; CGRect resultFrame = [textView firstRectForRange:(UITextRange *)range ]; UIView* tapViewOnText = [[UIView alloc] initWithFrame:resultFrame]; [tapViewOnText addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(targetRoutine)]]; tapViewOnText.tag = 125; [textView addSubview:tapViewOnText]; [tapViewOnText release]; pos = pos2;
}
我在这段代码中所做的是,得到相关文本的UITextRange,得到它的firstRectForRange,并在它上面添加了一个透明的可点击的UIView.
您必须使用一些regEx获取链接的范围,将其转换为UITextRange,并在它们上添加可点击的UIViews.如果单个textView中可能有多个链接,您可能会在每个视图中添加一个与其“链接”对应的标记,并通过检查其标记在目标方法中打开该链接.
注意:如果您的UITextView是普遍不可编辑的,您可能需要尝试TTTAttributedLabel
.这就是我在UITableViewCells中所做的