UITextView禁用文本选择

时间:2009-10-28 19:18:46

标签: ios objective-c iphone uitextview

我很难让UITextView禁用文本选择。

我试过了:

canCancelContentTouches = YES;

我尝试过子类化和覆盖:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender   

(但只有在选择后才会调用)

- (BOOL)touchesShouldCancelInContentView:(UIView *)view;  

(我看不到被解雇)

- (BOOL)touchesShouldBegin:(NSSet *)touches
                 withEvent:(UIEvent *)event
             inContentView:(UIView *)view; 

(我也没有看到被解雇)

我错过了什么?

11 个答案:

答案 0 :(得分:76)

问题How disable Copy, Cut, Select, Select All in UITextView有一个可行的解决方案,我刚刚实施并验证过:

子类UITextView并覆盖canBecomeFirstResponder:

- (BOOL)canBecomeFirstResponder {
    return NO;
}

请注意,这会禁用链接和其他可插入文本内容。

答案 1 :(得分:46)

我发现打电话了

[textView setUserInteractionEnabled:NO];

效果很好。

答案 2 :(得分:13)

UITextView' selectable财产:

  

此属性控制用户选择内容的能力   与URL和文本附件交互。默认值为YES。

答案 3 :(得分:9)

听起来你真正想要的是UIScrollView中的巨型UILabel,而不是UITextView。

更新:如果您使用的是较新版本的iOS,UILabel现在有一个行属性:

Multiple lines of text in UILabel

答案 4 :(得分:5)

如果您只是想阻止它被编辑,那么将UITextView的“可编辑”属性设置为NO / False。

如果你试图让它可编辑但不可选择,那将会很棘手。您可能需要创建一个用户可以键入的隐藏文本视图,然后让UITextView观察隐藏的textview并使用textview的文本填充自己。

答案 5 :(得分:3)

要做到这一点,首先要继承UITextView

并在实现中执行以下操作

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    self.selectable = NO;
}

- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
        self.selectable = YES;
 }

这应该可以正常工作,

答案 6 :(得分:1)

您是否尝试为您的UITextView设置userInteractionEnabled为NO?但是你也会失去滚动。

如果你需要滚动,这可能是你使用UITextView而不是UILabel的原因,那么你需要做更多的工作。对于您不想允许的操作,您可能必须覆盖canPerformAction:withSender:才能返回NO

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    switch (action) {
        case @selector(paste:):
        case @selector(copy:):
        case @selector(cut:):
        case @selector(cut:):
        case @selector(select:):
        case @selector(selectAll:):
        return NO;
    }
    return [super canPerformAction:action withSender:sender];
}

更多信息,UIResponderStandardEditActions

答案 7 :(得分:1)

您可以通过继承UITextView来禁用文本选择。

以下解决方案是:

/// Class to disallow text selection
/// while keeping support for loupe/magnifier and scrolling
/// https://stackoverflow.com/a/49428248/1033581
class UnselectableTextView: UITextView {

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        commonInit()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }
    private func commonInit() {
        // prevents selection from loupe/magnifier (_UITextSelectionForceGesture), multi tap, tap and a half, etc.
        // without losing the loupe/magnifier or scrolling
        // but we lose taps on links
        addSubview(transparentOverlayView)
    }
    let transparentOverlayView: UIView = {
        $0.backgroundColor = .clear
        $0.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        return $0
    }(UIView())
    override var contentSize: CGSize {
        didSet {
            transparentOverlayView.frame = CGRect(origin: .zero, size: contentSize)
        }
    }

    // required to prevent blue background selection from any situation
    override var selectedTextRange: UITextRange? {
        get { return nil }
        set {}
    }
}

答案 8 :(得分:1)

快捷键4 Xcode 10

此解决方案将

  • 禁用突出显示
  • 启用点击链接
  • 允许滚动

确保将委托设置为YourViewController

yourTextView.delegate = yourViewControllerInstance

然后

extension YourViewController: UITextViewDelegate {

    func textViewDidChangeSelection(_ textView: UITextView) {
        view.endEditing(true)
    }

}

答案 9 :(得分:1)

Swift 4,Xcode 10:

如果要创建文本,以便用户无法选择或编辑文本。

这使其无法编辑:

textView.isEditable = false

这将禁用所有用户交互:

textView.isUserInteractionEnabled = false

这样可以使您无法选择它。这意味着它不会显示编辑或粘贴选项。我认为这就是您要寻找的。

textView.isSelectable = false

答案 10 :(得分:0)

为了迅速,有一个名为“ isSelectable”的属性,默认情况下将其分配为true

您可以按以下方式使用它:

textView.isSelectable = false