มีวิธีที่ฉันสามารถใช้ได้เมื่อมีการแตะปุ่มใด ๆ บนแป้นพิมพ์บนแป้นพิมพ์ที่ใส่ข้อมูลลงในช่องข้อความใน Swift หรือไม่ ฉันจะทำอย่างไร (เช่น แสดงรูปภาพในมุมมองด้านขวาของ UITextField) เมื่อคีย์ใด ๆ ที่ใส่อินพุตใน UITextField (ยกเว้น เช่น คีย์อย่าง caps lock และปุ่มอิโมจิ / สลับภาษา) ถูกแตะ
Swift: มีวิธีเมื่อมีคนแตะปุ่มบนคีย์บอร์ดหรือไม่?
คำตอบ (6)
คุณสามารถทำได้ง่ายมาก
นี่คือรหัส:
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
}
}
เอาท์พุท:
หากคุณประสบปัญหาใดๆ ในเรื่องนี้ โปรดแจ้งให้เราทราบ
โดยทั่วไปแป้นพิมพ์จะมาในกรณีของ UITextfield และ UITextView ลองใช้ผู้รับมอบสิทธิ์ที่กล่าวถึงด้านล่าง
ดังนั้น ในกรณีของ UITextField
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
// Do something here...
}
เมื่อคุณใช้แป้นพิมพ์ในกรณีของ UITextView :
- (BOOL)textView:(UITextView *)textView
shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text {
// Do something here...
}
โปรดจำไว้ว่าทุกครั้งที่ผู้ใช้ป้อนอักขระบางตัวหรือกดปุ่มบนแป้นพิมพ์ วิธีนี้จะเรียกและคุณจะรู้ข้อความที่เขาเลือกจากแป้นพิมพ์
UITextFieldDelegate
และ UITextViewDelegate
- person rmaddy; 22.02.2019
คุณสามารถใช้ผู้รับมอบสิทธิ์นี้เพื่อควบคุม:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// String 键盘上新输入的字符,“”代表删除
//返回true会添加进去,返回false会忽略掉
return true
}
ใช่ คุณสามารถทำได้โดยเพิ่ม addTarget ใน viewDidLoad
override func viewDidLoad() {
// do your works
self.yourtextfield.addTarget(self, action: #selector(textFieldChanged), for: .editingChanged)
}
@objc func textFieldChanged() {
// do your work here
}
addTarget คืออะไร?
เชื่อมโยงวัตถุเป้าหมายและวิธีการดำเนินการกับตัวควบคุม
คุณจดบันทึก addTarget ว่าการกระทำใดที่คุณต้องการ (เช่น การแก้ไขการเปลี่ยนแปลง ฟิลด์ข้อความได้เริ่มแก้ไข หรือสิ้นสุดการแก้ไข) และวิธีการเลือกเชื่อมโยง เมื่อตัวควบคุมถูกเรียก (นี่คือการแก้ไขการเปลี่ยนแปลง) วิธีการเลือกนี้จะถูกเรียกใช้และคุณสามารถจัดการได้ รหัสสิ่งที่คุณต้องการเกี่ยวกับการควบคุม
คุณสามารถทำได้สองวิธี:
UITextFieldDelegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // Observer changes in text.... return true }
กลไกการกำหนดเป้าหมาย:
ใน viewDidLoad ของคุณให้เพิ่มโค้ดต่อไปนี้:
self.textfield.addTarget(self, action: #selector(textFieldTextChanged), for: .editingChanged)
และวิธีการปฏิบัติ:
@objc func textFieldTextChanged() {
print(self.textfield.text!)
}
อัปเดต:
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
}
}
โซลูชันของฉันสำหรับปุ่มล้างแบบกำหนดเอง:
เพียงเพิ่มสิ่งนี้นอกชั้นเรียนของคุณ
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