2014-02-19 68 views
6

我希望用戶可以複製和粘貼文本,但不能編輯它們。我使用委託UITextField方法來實現這一點:如何使UITextField可選但不可編輯?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range  replacementString:(NSString *)string{ 
    return NO; 
} 

這樣雖然文本是可選擇的和不可編輯的,但是當你選擇文本,鍵盤始終顯示出來,這是一個有點惱人,因爲你無法編輯文字。那麼無論如何要讓文本可選而不可編輯,而不顯示鍵盤?

+0

您是否嘗試過在'delegate'方法中首先調用'[textField resignFirsResponder]'。坦率地說,我不知道它會如何表現。只是問問。 –

+0

你也可以嘗試子類UITextField - 重寫'becomeFirstResponder1方法並返回'NO,但我認爲這將阻止用戶粘貼文本。 –

回答

1

你應該實現另一個UITextField的委託方法:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 
    return NO; 
} 

// UPDATE此外,還有這樣這裏How to disable UITextField's edit property?一個問題。

+0

這將不允許用戶粘貼文本。看看在這裏接受的答案應該工作的解決方案:http://stackoverflow.com/questions/5478719/uitextfield-hide-keyboard – TheEye

+1

我試過這個。但是這個文本既不可選也不可編輯,就像UIlabel一樣。 – chaonextdoor

+0

@TheEye謝謝你!它像一個魅力。 – chaonextdoor

10

您需要的是允許控件接收所有用戶交互事件。所以,請從textFieldShouldBeginEditing請勿return NO。相反,做到以下幾點:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    return textField != _yourReadOnlyTextField; 
} 

這將允許用戶選擇文本,並選擇喜歡CutCopyDefine從彈出菜單中選擇。

UPDATE:

而且,完整性,您可能要防止鍵盤顯示出來,在所有的readyonly文本框。因此,基於所接受的回答了這個問題:uitextfield hide keyboard?,你可能要添加:

爲SWIFT用戶
- (void)viewDidLoad 
{ 
    // Prevent keyboard from showing up when editing read-only text field 
    _yourReadOnlyTextField.inputView = [[UIView alloc] initWithFrame:CGRectZero]; 
} 
+2

非常好。究竟需要什麼才能選擇和複製文本而不改變文本。 – James

+0

好的解決方案,但文本光標仍然存在。 – Toydor

+0

我的文本字段在UITableViewCell中,所以我查了 return textfield.tag!= 200 – Yaman

1

更新:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    return textField != self.yourReadOnlyTextField; 
} 

當視圖加載

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.selfCodeEdit.inputView = UIView.init(); 
} 
0

如果你有多於一個textFields你可以這樣做

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    if textField == firstTextField || textField == secondTextField { 
     return false 
    } 
    return true 
} 
相關問題