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

时间:2015-01-06 22:49:44

标签: ios cocoa-touch uitextview

当我长时间点击标准邮件应用中的任何文字时,我会看到一个"全选"选项。

enter image description here

但是,当我长时间点击我自己的UITextView中的文字时,我没有得到那个选项。我该如何添加它?

enter image description here

以下是我的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;

2 个答案:

答案 0 :(得分: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:方法也可以。

答案 1 :(得分: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)
    }
}