2015-02-09 55 views
7

我有一个UITextField我正在使用UIPickerView作为其inputView。用户可以从选取器中选择一个值,并将选定的值填入我的TextInput
这种安排工作正常,但有以下问题:禁用光标并复制/粘贴到UITextView(swift)

1)我想要禁用游标仍然显示在UITextField
我尝试禁用UITextField,但它不响应触摸,然后UIPickerView不显示 - 这使它无用。
2)由于选择器显示,键盘不是用户点击文本字段,用户不能键入任何内容,但仍然可以通过长时间按压粘贴从其他地方复制的文本。我如何禁用此功能?

我无法在网上找到相关信息。我应该使用Label还是使用Button代替UITextInput

回答

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

+0

对于任何试图保持dataDetectorTypes特性的人来说,这是一个很好的解决方案,不允许用户选择(即复制,全选,查找)可执行数据周围的其余文本。 谢谢@TonyMkenu – 2017-11-11 01:54:13

0

UITextField代表可以实施textFieldShouldBeginEditing方法。如果该方法总是返回NO,那么光标永远不会出现,并且长按不会被允许。

当调用该方法时,可以显示UIPickerView。但是,UIPickerView不能是inputView。它需要是从底部开始生成的标准UIView的孩子。或者,您可以使用UIViewhidden属性根据需要隐藏/显示视图。

+0

我明白了,所以我使用'UIPickerView'作为'inputView'为'UITextView'的做法是错误的。你能否指点我一个例子,或者类似的方法来做正确的事情? – rgamber 2015-02-10 03:42:09

+0

是的,这会变得有问题,因为我仍然使用objective-C,并且尽可能避免自动布局,所以我可以帮助理解概念,但与代码无关。 – user3386109 2015-02-10 04:27:11

7

像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

完全傻了破解,但是如果你在Interface Builder的属性检查器的UIView部分设置文本字段的色调的颜色相匹配的背景颜色,光标就会出现隐形: