2015-02-09 198 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部分設置文本字段的色調的顏色相匹配的背景顏色,光標就會出現隱形: