禁用光标并在UITextView中复制/粘贴(swift)

时间:2015-02-09 21:36:26

标签: ios xcode swift uitextfield uipickerview

我有UITextField我使用UIPickerView作为inputView。用户可以从选择器中选择一个值,并将选定的值填充到我的TextInput中。
这种安排工作正常,但有以下问题:

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

我无法在线查找相关信息。我应该使用Label还是Button而不是UITextInput

5 个答案:

答案 0 :(得分:8)

就像TonyMkenu所说,你需要继承UITextField,然后实现他上面的方法。对于那些不了解目标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)
}

答案 1 :(得分:6)

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

很抱歉 - 这不适用于Swift Obj-C,但这是个主意:

要使用UITextField执行您想要的操作,您必须继承UITextField并尝试使用此代码来禁用/隐藏插入符号和输入(复制/粘贴)

- (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/

无论如何......这是一个“功能性”的例子:https://github.com/hackiftekhar/IQDropDownTextField

答案 2 :(得分:1)

UITextField委托可以实施textFieldShouldBeginEditing方法。如果该方法始终返回NO,则光标将永远不会出现,并且不允许长按。

调用方法后,您可以显示UIPickerView。但是,UIPickerView不能是inputView。它需要是您从底部动画的标准UIView的孩子。或者您可以使用hidden的{​​{1}}属性隐藏/显示视图。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

SWIFT 4

创建TextField.swift文件并更改导入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,选择该文本字段并将其自定义类更改为TextField

Xcode Image