我目前有一个带有默认文本的UITextField,并在编辑开始时设置为清除。我正在努力使它如果字段为空或编辑完成时为零,则文本值将再次成为默认文本。我无法检测编辑完成或键盘被解除的时间。谁能告诉我我想要使用哪种检测方法以及如何实现它?非常感谢!
在我的情况下不能使用placeholder
答案 0 :(得分:13)
你必须使用textfield delegate
-(void)textFieldDidEndEditing:(UITextField *)textField;
在这个委托中进行像这样的检查
if ( [textField.text length] == 0 )
{
// the text field is empty do your work
} else {
/// the text field is not empty
}
答案 1 :(得分:8)
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string
{
if (range.location == 0 && string.length == 0)
{
//textField is empty
}
return YES;
}
答案 2 :(得分:4)
我认为您不需要自己处理“默认文本”。检查UITextField
类的placeholder
属性。
<强>更新强>
所以placeholder
对你的情况不利。您是否尝试为UITextField
实施UITextFieldDelegate
方法并更改textViewDidEndEditing:
中的文字?
为此,请在视图控制器中实现对您的方案有用的UITextFieldDelegate
方法,并将delegate
的{{1}}设置为视图控制器(通过Interface Builder或以编程方式) )。在UITextField
方法中设置默认文本。
您可以参考Text, Web, and Editing Programming Guide for iOS的“获取输入文字和设置文字”部分。
答案 3 :(得分:2)
当您收到文本字段返回时的委托调用时,请使用sender
参数检查文本(sender.text
),如果它等于@""
则设置默认值文本。
答案 4 :(得分:1)
您还需要检查是否删除的范围是文本的整个长度。
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
}
答案 5 :(得分:1)
我使用2种方法。我的选择取决于应用程序的业务逻辑。
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
}
}