我有UITextField
我使用UIPickerView
作为inputView
。用户可以从选择器中选择一个值,并将选定的值填充到我的TextInput
中。
这种安排工作正常,但有以下问题:
1)我想禁用仍在UITextField
中显示的光标。
我尝试禁用UITextField
,但之后它没有响应触摸,然后UIPickerView
没有显示 - 这使得它无用。
2)由于显示了选择器并且键盘没有用户点击文本字段,用户无法键入任何内容,但仍可以通过长按来粘贴从其他地方复制的文本。如何禁用此功能?
我无法在线查找相关信息。我应该使用Label
还是Button
而不是UITextInput
?
答案 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