在 UITextView (swift) 中禁用光标和 copy/paste

Disable cursor and copy/paste in UITextView (swift)

我有一个 UITextField,我使用 UIPickerView 作为它的 inputView。用户可以 select 来自选择器的值,selected 值会填充到我的 TextInput 中。
这种安排工作正常,但存在以下问题:

1) 我想禁用仍然显示在 UITextField 中的光标。
我尝试禁用 UITextField,但随后它不响应触摸,然后 UIPickerView 不显示 - 这使其无用。
2)由于显示了选择器并且用户没有在文本字段上点击键盘,因此用户无法键入任何内容,但仍然可以通过长按粘贴从其他地方复制的文本。我怎样才能禁用它?

我无法在网上找到相关信息。我应该为此使用 Label 还是 Button 而不是 UITextInput

UITextField 委托可以实现 textFieldShouldBeginEditing 方法。如果那个方法总是returns NO,那么光标将永远不会出现,长按也不会被允许。

调用方法时,可以显示UIPickerView。但是,UIPickerView 不能是 inputView。它需要是您从底部开始制作动画的标准 UIView 的子级。或者您可以根据需要使用 UIViewhidden 属性 到 hide/show 视图。

我认为简单的方法是用按钮代替 UITextField

抱歉 - 这不适用于 Swift 它适用于 Obj-C 但这是想法:

要用 UITextField 做你想做的事,你必须对 UITextField 进行子类化,并尝试将此代码用于 disable/hide 插入符并输入 (copy/paste)

- (CGRect) caretRectForPosition:(UITextPosition*) position
{
    return CGRectZero;
}

- (NSArray *)selectionRectsForRange:(UITextRange *)range
{
    return nil;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:))
    {
        returnNO;
    }
    return [super canPerformAction:action withSender:sender];
}

示例来自此处:http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/

无论如何...这是一个 "functional" 示例:https://github.com/hackiftekhar/IQDropDownTextField

就像TonyMkenu说的,你需要继承UITextField,然后实现他上面的方法。这是 Swift 给那些不认识 Objective C 的人:

override func caretRectForPosition(position: UITextPosition!) -> CGRect {
    return CGRect.zeroRect
}

override func selectionRectsForRange(range: UITextRange) -> [AnyObject] {
    return []
}

override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
    // Disable copy, select all, paste
    if action == Selector("copy:") || action == Selector("selectAll:") || action == Selector("paste:") {
        return false
    }
    // Default
    return super.canPerformAction(action, withSender: sender)
}

完全愚蠢的 hack,但如果您在 Interface Builder UIView 部分中设置文本字段的色调颜色 属性 检查器以匹配背景颜色,则光标将不可见:

SWIFT 4

创建 TextField.swift 文件并更改 import Foundation 以导入 UIKit 并在 TextFeild.swift 文件中添加以下代码

import UIKit

class TextFeild: UITextField {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        // write code here what ever you want to change property for textfeild. 
    }

    override func caretRect(for position: UITextPosition) -> CGRect {
        return CGRect.zero
    }

    override func selectionRects(for range: UITextRange) -> [Any] {
        return []
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if action == #selector(UIResponderStandardEditActions.copy(_:)) || action == #selector(UIResponderStandardEditActions.selectAll(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) {
            return false
        }
        // Default
        return super.canPerformAction(action, withSender: sender)
    }
}

转到 main.storyboard,select 该文本字段并将其自定义 class 更改为 TextField