Apakah ada metode yang dapat saya gunakan ketika ada tombol pada keyboard yang diketuk pada keyboard yang memasukkan input ke dalam kolom teks di Swift? Bagaimana cara melakukan sesuatu (Misalnya menampilkan gambar di tampilan kanan UITextField) ketika kunci apa pun yang memasukkan input ke UITextField (Tidak termasuk, misalnya, tombol seperti caps lock dan tombol emoji/alih bahasa) diketuk?
Swift: Apakah ada metode ketika seseorang mengetuk tombol pada keyboard?
Jawaban (6)
Anda dapat melakukannya dengan sangat mudah
Ini kodenya:
extension ViewController : UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let userImageView = UIImageView(image: UIImage(named: "user"))
userImageView.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
self.txtField.rightViewMode = .always
if let textFieldValue = textField.text,
let textFieldRange = Range(range, in: textFieldValue) {
let newText = textFieldValue.replacingCharacters(in: textFieldRange, with: string)
if newText == "" {
textField.rightView = nil
} else {
textField.rightView = userImageView
}
}
return true
}
}
Keluaran:
Jika Anda menghadapi kesulitan dalam hal ini, harap beri tahu saya.
Keyboard umumnya akan muncul dalam kasus UITextfield dan UITextView coba gunakan delegasi yang disebutkan di bawah.
Jadi, dalam kasus UITextField
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
// Do something here...
}
Saat Anda menggunakan keyboard Dalam Kasus UITextView :
- (BOOL)textView:(UITextView *)textView
shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text {
// Do something here...
}
Ingat ini, setiap kali pengguna memasukkan beberapa karakter atau menekan beberapa tombol di keyboard, metode ini akan memanggil dan Anda akan mengetahui teks yang dia pilih dari keyboard.
UITextFieldDelegate
dan UITextViewDelegate
.
- person rmaddy; 22.02.2019
Anda dapat menggunakan delegasi ini untuk mengontrolnya:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// String 键盘上新输入的字符,“”代表删除
//返回true会添加进去,返回false会忽略掉
return true
}
ya, Anda dapat melakukannya dengan menambahkan addTarget di viewDidLoad
override func viewDidLoad() {
// do your works
self.yourtextfield.addTarget(self, action: #selector(textFieldChanged), for: .editingChanged)
}
@objc func textFieldChanged() {
// do your work here
}
Apa itu addTarget?
Mengaitkan objek target dan metode tindakan dengan kontrol.
Anda menuliskan addTarget dengan tindakan yang Anda inginkan (yaitu mengedit perubahan, bidang teks mulai mengedit, atau mengakhiri pengeditan) dan metode pemilih terkait, ketika kontrol dipanggil (di sini pengeditan berubah), metode pemilih ini akan dipanggil dan Anda dapat menanganinya kode apa yang Anda inginkan mengenai kontrol
Anda dapat melakukannya dengan dua cara:
Delegasi UITextField
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // Observer changes in text.... return true }
Mekanisme Target-Tindakan:
Di viewDidLoad Anda, tambahkan kode berikut:
self.textfield.addTarget(self, action: #selector(textFieldTextChanged), for: .editingChanged)
Dan menerapkan metode:
@objc func textFieldTextChanged() {
print(self.textfield.text!)
}
Diperbarui:
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
let rightView = UIView(frame: CGRect(x: -10, y: 0, width: 20, height: 20))
override func viewDidLoad() {
super.viewDidLoad()
rightView.backgroundColor = .red
textField.rightView = rightView
textField.rightViewMode = .always
}
}
extension ViewController : UITextFieldDelegate {
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
if let text = textField.text, let textRange = Range(range, in: text) {
let updatedText = text.replacingCharacters(in: textRange, with: string)
if updatedText == "" {
textField.rightView = nil
} else {
textField.rightView = rightView
}
}
return true
}
}
Solusi saya untuk tombol hapus khusus:
Tambahkan saja ini di luar kelas Anda
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let clearButton = UIImageView(frame:
CGRect(x: 7, y: 7, width: 16, height: 16))
clearButton.image = #imageLiteral(resourceName: "Clear")
let iconContainerView: UIView = UIView(frame:
CGRect(x: 0, y: 0, width: 37, height: 30))
iconContainerView.addSubview(clearButton)
iconContainerView.tintColor = #colorLiteral(red: 0.5568627451, green: 0.5568627451, blue: 0.5764705882, alpha: 1)
textField.rightView = iconContainerView
textField.rightViewMode = .whileEditing
if let textFieldValue = textField.text, let textFieldRange = Range(range, in: textFieldValue) {
let newText = textFieldValue.replacingCharacters(in: textFieldRange, with: string)
if newText == "" {
textField.rightView = nil
} else {
textField.rightView = iconContainerView
}
}
return true
}
}
UITextFieldDelegate?
- person Alexander   schedule 22.02.2019