gpt4 book ai didi

ios - 使用硬件键盘时不为 UITextField 调用 shouldChangeText

转载 作者:行者123 更新时间:2023-11-28 12:24:59 25 4
gpt4 key购买 nike

我有一个 UITextField 的子类,我希望该子类控制哪些输入值有效。我通过覆盖子类中的 shouldChangeText(in:, replacementText:) -> Bool 方法解决了这个问题。但这仅在使用屏幕键盘时调用。如果我使用硬件键盘,则不会调用它。

当使用硬件键盘时,textField(_ textField:, shouldChangeCharactersIn:, replacementString:) -> BoolUITextFieldDelegate 上调用。但是我不想将委托(delegate)分配给文本字段本身,因为我需要某些 View Controller 中的委托(delegate)用于其他目的。所以我需要一种替代方法来验证输入值,例如 shouldChangeText(in:, replacementText:) -> Bool 为我提供了屏幕键盘。

我可以在委托(delegate)方法的堆栈跟踪中看到,系统调用了 [UITextField keyboardInput:shouldInsertText:isMarkedText:],但我无法覆盖它。

有没有办法解决这个问题,而不分配委托(delegate)?

最佳答案

这是一个替代解决方案,它允许您的“真实”文本字段委托(delegate)和您的自定义文本字段类实现另外一个委托(delegate)方法。

下面的代码允许此自定义文本字段实现任何所需的 UITextField 委托(delegate)方法,同时仍然允许真正的委托(delegate)实现它需要的任何方法。唯一的要求是,对于在自定义文本字段内实现的任何委托(delegate)方法,您必须检查真正的委托(delegate)是否也实现了它并在需要时调用它。任何在真实委托(delegate)类中实现的委托(delegate)方法都应该正常编写。

这个简单的自定义文本字段示例设置为仅允许数字。但它让文本字段的真正委托(delegate)进行其他验证,例如只允许一定长度的数字或特定范围或其他任何内容。

import UIKit

class MyTextField: UITextField, UITextFieldDelegate {
private var realDelegate: UITextFieldDelegate?

// Keep track of the text field's real delegate
override var delegate: UITextFieldDelegate? {
get {
return realDelegate
}
set {
realDelegate = newValue
}
}

override init(frame: CGRect) {
super.init(frame: frame)

// Make the text field its own delegate
super.delegate = self
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)

// Make the text field its own delegate
super.delegate = self
}

// This is one third of the magic
override func forwardingTarget(for aSelector: Selector!) -> Any? {
if let realDelegate = realDelegate, realDelegate.responds(to: aSelector) {
return realDelegate
} else {
return super.forwardingTarget(for: aSelector)
}
}

// This is another third of the magic
override func responds(to aSelector: Selector!) -> Bool {
if let realDelegate = realDelegate, realDelegate.responds(to: aSelector) {
return true
} else {
return super.responds(to: aSelector)
}
}

// And the last third
// This only allows numbers to be typed into the text field.
// Of course this can be changed to do whatever validation you need in this custom text field
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) != nil {
return false // Not a number - fail
} else {
// The string is valid, now let the real delegate decide
if let delegate = realDelegate, delegate.responds(to: #selector(textField(_:shouldChangeCharactersIn:replacementString:))) {
return delegate.textField!(textField, shouldChangeCharactersIn: range, replacementString: string)
} else {
return true
}
}
}
}

我留作练习的唯一其他复杂情况是自定义文本字段想要修改更改的文本,然后允许真正的委托(delegate)确定是否应允许修改的字符串/范围。

关于ios - 使用硬件键盘时不为 UITextField 调用 shouldChangeText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43679859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com