【发布时间】:2018-08-08 05:25:53
【问题描述】:
我是一个快速的初学者。我在 ViewController 中实现了这个功能,但我不想在每个 ViewController 中编写这样的代码。我想通过协议来实现它,但是出了点问题。
import UIKit
@objc protocol TextFieldAutoHiddenKeyboard: class {
var textFieldAutoHidenLenth: UInt {get set}
}
extension TextFieldAutoHiddenKeyboard where Self: UIViewController {
func autoHiddenKeyboardWhenFillUpTextFiled(textField textF: UITextField, autoHidenLenth: UInt) {
textFieldAutoHidenLenth = autoHidenLenth
let textFieldDidChangeActionName = "textFieldDidChange(textField:)"
let textFieldDidChangeAction = Selector(textFieldDidChangeActionName)
textF.addTarget(self, action: textFieldDidChangeAction, for: .editingChanged)
let dismissKeyboardActionName = "dismissKeyboard"
let dismissKeyboardAction = Selector(dismissKeyboardActionName)
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: dismissKeyboardAction)
view.addGestureRecognizer(tap)
//textF.addTarget(self, action: #selector(textFieldDidChange(textField:autoHidenLenth:)), for: .editingChanged)
}
func textFieldDidChange(textField: UITextField) {
if let text = textField.text {
if text.count == textFieldAutoHidenLenth {
textField.resignFirstResponder()
}
}
}
func dismissKeyboard() {
view.endEditing(true)
}
//@objc func textFieldDidChange(textField: UITextField, autoHidenLenth: UInt) {
// if let text = textField.text {
// if text.count == autoHidenLenth {
// textField.resignFirstResponder()
// }
// }
//}
}
- 为什么我的应用程序崩溃。 EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)
- 通过使用选择器
#selector(textFieldDidChange(textField:autoHidenLenth:))创建一个动作,我不知道如何将第二个参数传递给函数。例如参数 autoHidenLenth。 - 如何通过协议正确实现该功能?
(来源:recordit.co)
【问题讨论】:
-
能否提供完整的崩溃日志。
-
您只需要使用TextField委托方法并检查输入的长度是否大于6或者不是退格字符然后不允许将其添加到文本字段。
-
您不需要任何此代码。只需子类化 viewController 并尝试我发布的答案。
-
@Lal Krishna 和@Rakesha Shastri 的回答真的对我有帮助。我尝试使用委托方法`func textField(_ textField:UITextField,shouldChangeCharactersIn range:NSRange,replacementString string:String)-> Bool {}`来实现这个功能。我认为它很不令人满意。不要忘记用户可以通过手机剪贴板粘贴内容。
-
如果结果超过 6 个字符,您可以阻止用户的复制粘贴。我已经用这个逻辑更新了我的答案。
标签: ios swift keyboard uitextfielddelegate