当我长按标准Mail应用程序中的任何文本时,将显示“全选”选项。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9rck0zSy5wbmcifQ==” alt =“在此处输入图像描述”>
但是,当我在自己的UITextView中长按文本时,我没有得到该选项。如何添加?
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9ZMWxRSy5wbmcifQ==” alt =“在此处输入图像描述”>
以下是我的UITextView的相关代码已设置:
self.messageLabel = [[UITextView alloc] init];
self.messageLabel.dataDetectorTypes = UIDataDetectorTypeAll;
self.messageLabel.editable = NO;
self.messageLabel.scrollEnabled = NO;
self.messageLabel.selectable = YES;
self.messageLabel.textContainerInset = UIEdgeInsetsZero;
self.messageLabel.textContainer.lineFragmentPadding = 0.0;
是因为:
self.messageLabel.editable = NO;
因此,为了解决这个问题,您有三个选择。
删除该行(或将其设置为YES
),它将显示这些选项。
在定义了canPerformAction:
的viewController类中实施UITextView
方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(selectAll:))
{
return YES;
}
return [super canPerformAction:action withSender:sender];
}
并实现selectAll:
方法,如:
- (void)selectAll:(id)sender
{
[self.messageLabel selectAll:sender];
}
注意:如果您未实现canPerformAction:
,则仅定义selectAll:
方法也将起作用。
子类UITextView
和重写canPerformAction:withSender:
将解决问题。
class TextView : UITextView {
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(selectAll) {
if let range = selectedTextRange, range.start == beginningOfDocument, range.end == endOfDocument {
return false // already selected all text
}
return !text.isEmpty
}
return super.canPerformAction(action, withSender: sender)
}
}