当 UITextField 中达到最大字符数时,键盘上的完成按钮将不起作用
Done button on keyboard won't work when maximum characters reached in UITextField
我正在使用以下代码限制文本字段中允许的字符数:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let newLength = (textField.text!).characters.count + string.characters.count - range.length
return newLength <= 10
}
这很好用。但是当输入10个字符后,按'Done'没有任何作用,也不会关闭键盘。
我在 return newLength <= 10
之前添加了以下行来调试:
print("textField.characters.count = \((textField.text!).characters.count), string.characters.count = \(string.characters.count)., range.length = \(range.length). So newLength = \(newLength)")
这些是结果(输入一个字符后每行出现):
textField.characters.count = 0, string.characters.count = 1., range.length = 0. So newLength = 1
textField.characters.count = 1, string.characters.count = 1., range.length = 0. So newLength = 2
textField.characters.count = 2, string.characters.count = 1., range.length = 0. So newLength = 3
textField.characters.count = 3, string.characters.count = 1., range.length = 0. So newLength = 4
textField.characters.count = 4, string.characters.count = 1., range.length = 0. So newLength = 5
textField.characters.count = 5, string.characters.count = 1., range.length = 0. So newLength = 6
textField.characters.count = 6, string.characters.count = 1., range.length = 0. So newLength = 7
textField.characters.count = 7, string.characters.count = 1., range.length = 0. So newLength = 8
textField.characters.count = 8, string.characters.count = 1., range.length = 0. So newLength = 9
textField.characters.count = 9, string.characters.count = 1., range.length = 0. So newLength = 10
一切都很好。但是当我然后按下 'Done',而不是关闭键盘并调用我连接到 'Did end on exit' 的函数时,屏幕上没有任何反应,我得到这个:
textField.characters.count = 10, string.characters.count = 1., range.length = 0.
所以 newLength = 11
.
重复按 'Done' 会一遍又一遍地吐出最后一行。有人可以帮我按“完成”关闭键盘吗?
Try with the following code:-
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if(range.length + range.location > textField.text.length)
{
return NO;
}
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return newLength <= 10;
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if (range.length + range.location > count(textField.text) )
{
return false;
}
let newLength = count(textField.text) + count(string) - range.length
return newLength <= 10
}
我并没有真正解决这个问题,但想出了一个解决方法,允许用户通过点击屏幕上的其他任何地方来关闭键盘。因此,希望当 'Done' 按钮在达到最大字符数时不起作用时,用户将尝试点击其他地方。远非理想,但暂时可以。
万一有人想知道,我通过在 viewDidAppear
中添加以下内容来做到这一点:
// Closes keyboard when tapping anywhere else on screen
let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleSingleTap:")
tapRecognizer.numberOfTapsRequired = 1
self.view.addGestureRecognizer(tapRecognizer)
然后我添加了以下功能:
func handleSingleTap(recognizer: UITapGestureRecognizer) {
self.view.endEditing(true)
}
我正在使用以下代码限制文本字段中允许的字符数:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let newLength = (textField.text!).characters.count + string.characters.count - range.length
return newLength <= 10
}
这很好用。但是当输入10个字符后,按'Done'没有任何作用,也不会关闭键盘。
我在 return newLength <= 10
之前添加了以下行来调试:
print("textField.characters.count = \((textField.text!).characters.count), string.characters.count = \(string.characters.count)., range.length = \(range.length). So newLength = \(newLength)")
这些是结果(输入一个字符后每行出现):
textField.characters.count = 0, string.characters.count = 1., range.length = 0. So newLength = 1
textField.characters.count = 1, string.characters.count = 1., range.length = 0. So newLength = 2
textField.characters.count = 2, string.characters.count = 1., range.length = 0. So newLength = 3
textField.characters.count = 3, string.characters.count = 1., range.length = 0. So newLength = 4
textField.characters.count = 4, string.characters.count = 1., range.length = 0. So newLength = 5
textField.characters.count = 5, string.characters.count = 1., range.length = 0. So newLength = 6
textField.characters.count = 6, string.characters.count = 1., range.length = 0. So newLength = 7
textField.characters.count = 7, string.characters.count = 1., range.length = 0. So newLength = 8
textField.characters.count = 8, string.characters.count = 1., range.length = 0. So newLength = 9
textField.characters.count = 9, string.characters.count = 1., range.length = 0. So newLength = 10
一切都很好。但是当我然后按下 'Done',而不是关闭键盘并调用我连接到 'Did end on exit' 的函数时,屏幕上没有任何反应,我得到这个:
textField.characters.count = 10, string.characters.count = 1., range.length = 0.
所以 newLength = 11
.
重复按 'Done' 会一遍又一遍地吐出最后一行。有人可以帮我按“完成”关闭键盘吗?
Try with the following code:-
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if(range.length + range.location > textField.text.length)
{
return NO;
}
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return newLength <= 10;
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if (range.length + range.location > count(textField.text) )
{
return false;
}
let newLength = count(textField.text) + count(string) - range.length
return newLength <= 10
}
我并没有真正解决这个问题,但想出了一个解决方法,允许用户通过点击屏幕上的其他任何地方来关闭键盘。因此,希望当 'Done' 按钮在达到最大字符数时不起作用时,用户将尝试点击其他地方。远非理想,但暂时可以。
万一有人想知道,我通过在 viewDidAppear
中添加以下内容来做到这一点:
// Closes keyboard when tapping anywhere else on screen
let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleSingleTap:")
tapRecognizer.numberOfTapsRequired = 1
self.view.addGestureRecognizer(tapRecognizer)
然后我添加了以下功能:
func handleSingleTap(recognizer: UITapGestureRecognizer) {
self.view.endEditing(true)
}