iOS 将 UITextView 文本选择传播到 UITableviewCell 以显示操作菜单项

iOS Propagate UITextView text selection to the UITableviewCell to display action menu items

在尝试了很多来自 SO 的不同答案之后,我决定提出自己的问题。

我有一个包含 UITextView 的 UITableViewCell。文本视图可以包含纯文本或 links。我基本上希望 link 是可选的,但长按 link 以外的任何地方都应该显示菜单操作,例如复制和粘贴。

到目前为止我已经尝试过什么。我已将 UITextView

子类化
-(BOOL)canBecomeFirstResponder {
    return NO;
}

我设置了bodyTextView.selectable = NO。这确实提供了所需的效果,但 link 变得不可选择。

一旦我更改为 bodyTextView.selectable = YES,link 是可选的,但长按其中只有文本的文本视图,选择没有任何操作的文本,如图所示。

理想情况下,我希望只有 link 是可选的。我也试过

- (void)textViewDidChangeSelection:(UITextView *)textView {
   if(!NSEqualRanges(textView.selectedRange, NSMakeRange(0, 0))) {
       textView.selectedRange = NSMakeRange(0, 0);
   }
}

这肯定会删除选择,但仍然无法显示弹出操作菜单。任何帮助,将不胜感激。

请仔细阅读这个 link 以创建 hyperlink,一旦您创建了 hyperlink,默认情况下会处理可选择的基于内容的操作。

经过多次尝试,我采用了以下方法。在 UITextView 的子类中,我检查了用户是否正在触摸 link,如果没有将 textview 设置为不可选择的

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  UITouch *touch = [[touches allObjects] lastObject];
  CGPoint tapLocation = [touch locationInView:self];
  UITextPosition *textPosition = [self closestPositionToPoint:tapLocation];
  NSDictionary *attributes = [self textStylingAtPosition:textPosition inDirection:UITextStorageDirectionForward];
  NSURL *url = attributes[NSLinkAttributeName];
  if (url) {
      self.selectable = YES;
  }else {
      self.selectable = NO;
  }
  [self.superview touchesBegan:touches withEvent:event];

}

这样,如果用户触摸到 textview 的非 link 部分,它就会传递到 superview。