我目前有一个带有默认文本的 UITextField,并在编辑开始时设置为清除。我正在尝试这样做,以便在完成编辑时如果该字段为空或 nil,则文本值将再次成为默认文本。我无法检测何时完成编辑或关闭键盘。谁能告诉我我想使用哪种检测方法以及如何实现它?非常感谢!
编辑
placeholder
在我的情况下不能使用A
我目前有一个带有默认文本的 UITextField,并在编辑开始时设置为清除。我正在尝试这样做,以便在完成编辑时如果该字段为空或 nil,则文本值将再次成为默认文本。我无法检测何时完成编辑或关闭键盘。谁能告诉我我想使用哪种检测方法以及如何实现它?非常感谢!
placeholder
在我的情况下不能使用A
您必须使用文本字段委托
-(void)textFieldDidEndEditing:(UITextField *)textField;
在这个委托中进行这样的检查
if ( [textField.text length] == 0 )
{
// the text field is empty do your work
} else {
/// the text field is not empty
}
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string
{
if (range.location == 0 && string.length == 0)
{
//textField is empty
}
return YES;
}
我认为您不需要自己处理“默认文本”。检查类placeholder
的属性UITextField
。
更新
所以placeholder
对你的情况不好。您是否尝试UITextFieldDelegate
为您实现方法UITextField
并更改文本textViewDidEndEditing:
?
为此,UITextFieldDelegate
请在视图控制器中实现对您的场景有用的方法,并将delegate
您UITextField
的设置为视图控制器(通过 Interface Builder 或以编程方式)。textViewDidEndEditing:
在方法中设置默认文本。
您可以参考iOS 的文本、Web 和编辑编程指南的“获取输入的文本和设置文本”部分。
当您在文本字段返回时收到委托调用时,使用sender
参数检查文本 ( sender.text
),如果等于则@""
设置您的默认文本。
我使用两种方法。我的选择取决于应用程序的业务逻辑。
1)我在应用更改后检查结果文本shouldChangeCharactersIn
:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
var text = textField.text ?? ""
let startIndex = text.index(text.startIndex, offsetBy: range.location)
let endIndex = text.index(text.startIndex, offsetBy: range.location + range.length)
text = text.replacingCharacters(in: startIndex..<endIndex, with: string)
if text.count == 0 {
// textField is empty
} else {
// textField is not empty
}
return true
}
2)我使用editingChanged
动作:
@IBAction private func textFieldDidChange(_ sender: UITextField) {
if (sender.text?.count ?? 0) == 0 {
// textField is empty
} else {
// textField is not empty
}
}
您还需要检查删除的范围是否是文本的整个长度。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if !(range.location == 0 && string.count == 0 && range.length == textField.text?.count) {
// Text field is empty
}
return true
}