我有一個文本字段,其佔位符爲letschat
。現在,只要我開始在我的文本框中輸入內容,我想將我的文本框顯示爲some @letschat
。當我的文本框爲空時,我的佔位符必須顯示。我做到了。但是,只要我開始在我的文本框中輸入內容,我就想設置它。無論我與打字我想這段文字也像可見:如何將隨後的文本添加到uitextfield
一些@Lletschat
我怎樣才能做到這一點?
我有一個文本字段,其佔位符爲letschat
。現在,只要我開始在我的文本框中輸入內容,我想將我的文本框顯示爲some @letschat
。當我的文本框爲空時,我的佔位符必須顯示。我做到了。但是,只要我開始在我的文本框中輸入內容,我就想設置它。無論我與打字我想這段文字也像可見:如何將隨後的文本添加到uitextfield
一些@Lletschat
我怎樣才能做到這一點?
順應你的類UITextfieldDelegate
,然後分配textfield.delegate = self
現在,添加這個委託的方法,如果你想用戶endtyping後要追加你@letschat。
func textFieldDidEndEditing(textField: UITextField) {
textField.text = "\(textField.text)@letschat"
}
或者如果你想在打字時間。
textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
func textFieldDidChange(textField: UITextField) {
if textField.containsString("@letschat") {
textField.text = textField.text.stringByReplacingOccurrencesOfString("@letschat", withString: "")
}
textField.text = "\(textField.text)@letschat"
}
希望這會有所幫助。
這將在設置文本後調用。 –
@SalmanGhumsani查看我編輯的答案 –
輸入幾個字符後,您是否收到「... @ letschat @ letschat @ letschat」? – Astoria
您可以使用UITextField
textFieldDidChange
的action,並在每次更改textField文本時獲得調用。
就像這樣:
func textChangedAction(sender:UITextFiled) {
if sender.text.rangeOfString("@Lletschat") != nil{
sender.text = sender.text.replacingOccurrences(of: "@Lletschat", with: "")
}
sender.text = "\(sender.text!) @Lletschat"
}
如果你想改變你的具體文字的顏色,你可以檢查here。
實現文本框的委託像這個 -
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
textField.text = textField.text?.replacingOccurrences(of: " @\(textField.placeholder!)", with: "", options: .literal, range: nil)
textField.text?.append(string)
textField.text?.append(" @\(textField.placeholder!)")
return false
}
簡單的解決方案:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let newRange = textField.text?.range(from: range), let result = textField.text?.replacingCharacters(in: newRange, with: string) else { return true }
if result.endsWithString("@letschat") {
return true
} else {
textField.text = result + "@letschat"
let position = textField.position(from: textField.beginningOfDocument, offset: result.characters.count)!
textField.selectedTextRange = textField.textRange(from: position, to: position)
return false
}
}
有了幫手擴展:
extension String {
func range(from oldOne: NSRange) -> Range<String.Index>? {
guard
let from16 = utf16.index(utf16.startIndex, offsetBy: oldOne.location, limitedBy: utf16.endIndex),
let to16 = utf16.index(utf16.startIndex, offsetBy: oldOne.location + oldOne.length, limitedBy: utf16.endIndex),
let from = from16.samePosition(in: self),
let to = to16.samePosition(in: self)
else { return nil }
return from ..< to
}
func endsWithString(_ string: String) -> Bool {
guard characters.count >= string.characters.count else { return false }
let index = self.index(startIndex, offsetBy: characters.count - string.characters.count)
let substring = self.substring(from: index)
return substring == string
}
}
難,但明確的解決方案是創建你自己的UIControl
-subclass與UITextField
和UILabel
兒童意見:
+-----------+ +-----------+
| textfield | -(3px)- | @letschat |
+-----------+ +-----------+
使用autolayout來保持它之間的3個像素的距離。 不要忘記配置你的班級,把所有傳入的動作發送到文本字段。您可以對這些控件使用不同的字體顏色,以便用戶不會對改變標籤價值的努力感到困惑。
我創建了一個UITextField
子類,它使用佔位符(如果設置)作爲後綴。據我所見,一切都按預期工作。也許有一些調整需要適應您的需求。
隨意問,如果有不清楚的地方:
class SuffixTextField: UITextField {
override init(frame: CGRect) {
super.init(frame: frame)
sharedInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
sharedInit()
}
private func sharedInit() {
addTarget(self, action: #selector(textChanged), for: .editingChanged)
}
override var text: String? {
didSet {
selectedTextRange = maxTextRange
}
}
override var attributedText: NSAttributedString? {
didSet {
selectedTextRange = maxTextRange
}
}
@objc private func textChanged() {
if let currentText = text, let placeholder = placeholder {
if currentText == placeholder {
self.text = nil
} else if !currentText.hasSuffix(placeholder) {
self.text = currentText + placeholder
}
}
}
private var maxCursorPosition: UITextPosition? {
guard let placeholder = placeholder, !placeholder.isEmpty else { return nil }
guard let text = text, !text.isEmpty else { return nil }
return position(from: beginningOfDocument, offset: (text as NSString).range(of: placeholder, options: .backwards).location)
}
private var maxTextRange: UITextRange? {
guard let maxCursorPosition = maxCursorPosition else { return nil }
return textRange(from: maxCursorPosition, to: maxCursorPosition)
}
override var selectedTextRange: UITextRange? {
get { return super.selectedTextRange }
set {
guard let newRange = newValue,
let maxCursorPosition = maxCursorPosition else {
super.selectedTextRange = newValue
return
}
if compare(maxCursorPosition, to: newRange.start) == .orderedAscending {
super.selectedTextRange = textRange(from: maxCursorPosition, to: maxCursorPosition)
} else if compare(maxCursorPosition, to: newRange.end) == .orderedAscending {
super.selectedTextRange = textRange(from: newRange.start, to: maxCursorPosition)
} else {
super.selectedTextRange = newValue
}
}
}
}
在這裏你可以看到一個預覽: https://www.dropbox.com/s/etkbme37wuxbw1q/preview.mov?dl=0
我已經使用ur代碼解決方案與持有人的價值..但ist一點也不反映...可以請你分享代碼..所以,這將有助於 – doubtman
沒有更多的代碼。您只需以編程方式創建'SuffixTextField'或在故事板中添加文本字段並將其自定義類設置爲'SuffixTextField'。 –
你想去哪裏該文本將出現?在打字的下面? – Astoria
@Astoria YEAH ...我measn ...當我完成鍵入我的文本框,如果我的文本字段中沒有文本。那時候我的佔位符shoyld顯示...當我開始輸入我的佔位符應該隱藏...並且如果我輸入'a'.then自動我必須看到'a @ letschat'。同樣的,如果我輸入更多的詞像'adasd @ letschat'必須在文本字段中可見 – doubtman