2017-08-14 57 views
0

我有一個文本字段,其佔位符爲letschat。現在,只要我開始在我的文本框中輸入內容,我想將我的文本框顯示爲some @letschat。當我的文本框爲空時,我的佔位符必須顯示。我做到了。但是,只要我開始在我的文本框中輸入內容,我就想設置它。無論我與打字我想這段文字也像可見:如何將隨後的文本添加到uitextfield

一些@Lletschat

我怎樣才能做到這一點?

+0

你想去哪裏該文本將出現?在打字的下面? – Astoria

+0

@Astoria YEAH ...我measn ...當我完成鍵入我的文本框,如果我的文本字段中沒有文本。那時候我的佔位符shoyld顯示...當我開始輸入我的佔位符應該隱藏...並且如果我輸入'a'.then自動我必須看到'a @ letschat'。同樣的,如果我輸入更多的詞像'adasd @ letschat'必須在文本字段中可見 – doubtman

回答

0

順應你的類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" 

} 

希望這會有所幫助。

+0

這將在設置文本後調用。 –

+0

@SalmanGhumsani查看我編輯的答案 –

+0

輸入幾個字符後,您是否收到「... @ letschat @ letschat @ letschat」? – Astoria

0

您可以使用UITextFieldtextFieldDidChangeaction,並在每次更改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

0

實現文本框的委託像這個 -

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 
} 
0

簡單的解決方案:

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與UITextFieldUILabel兒童意見:

+-----------+   +-----------+ 
| textfield | -(3px)- | @letschat | 
+-----------+   +-----------+ 

使用autolayout來保持它之間的3個像素的距離。 不要忘記配置你的班級,把所有傳入的動作發送到文本字段。您可以對這些控件使用不同的字體顏色,以便用戶不會對改變標籤價值的努力感到困惑。

+0

@ Astoria.Ya它的工作。但是,一旦我開始編輯它的顯示,那罰款..但是當我取消所有的文本,沒有文本我的意思是甚至沒有一個字母在文本字段..然後我的佔位符必須顯示。但現在仍然有'@letschat'si顯示。我怎麼能達到 – doubtman

+0

@doubtman嘗試玩'if結果==「@letschat」{//設置零值並返回false}' – Astoria

+0

而「@letschat」不能編輯。並且我將標記放置在「@letschat」後面再一次「@letschat」也加上 – doubtman

0

我創建了一個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

+0

我已經使用ur代碼解決方案與持有人的價值..但ist一點也不反映...可以請你分享代碼..所以,這將有助於 – doubtman

+0

沒有更多的代碼。您只需以編程方式創建'SuffixTextField'或在故事板中添加文本字段並將其自定義類設置爲'SuffixTextField'。 –