长按UITextView后添加“全选”选项

问题描述 投票:2回答:2

当我长按标准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;
ios cocoa-touch uitextview
2个回答
7
投票

是因为:

self.messageLabel.editable = NO;

因此,为了解决这个问题,您有三个选择。

选项1

删除该行(或将其设置为YES),它将显示这些选项。


选项2

自定义UIMenuController


选项3

在定义了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:方法也将起作用。


0
投票

子类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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.