怎样完全清空uitextfield 内容变化里的内容

iOS6下UITextField退格变清空问题的解决方法 - 推酷
iOS6下UITextField退格变清空问题的解决方法
自己的项目中一直有一个必现的UITextField退格变清空问题,测试发现只有iOS6下有,其它iOS版本都没有问题,基本上可以确定与iOS6有关。由于问题不是很大又忙就搁置了很久,今天实在不能忍受便花了点时间解决此问题,记录一下吧。
这个问题是在某个有默认值的UITextField上是必现的,一旦用退格键删除最后一个字符或中间某个字符,整个UITextfield的内容被清空了,一直百思不得其解,google了一下发现有人遇到类似的问题,并给出了复现步骤(
有一个secureTextEntry为Yes的UITextField和 一个普通的UITextField,重现步骤:
1. 点击普通的UITextField输入类容,
2. 点击密码UITextField输入内容,
3. 点击普通的UITextField重新获得焦点,
4. 接着点击键盘上的退格键,
结果:这时会发现普通的UITextField被清空了。
测试了一下,随便找一个有用户名与密码登录页面的应用,在iOS6下就会复现出这个问题,比如iPhone自带的邮件app。但这个重现步骤说得并不准确,第1步和第2步的前提是对应的UITextField已经有内容,虽然跟自己的复现方法有点不一样,不过总算知道这个问题是怎么回事了。怎么说呢,这应该是iOS6的UITextField的一个新特性引入的问题,原文把这个问题称之为“iOS 6 Secure密码UITextField造成非密码UITextField退格清空Bug”,但是iOS6.0就有这个问题,iOS6.1.3都没有解决,估计apple没把它当bug,坑爹啊。
咱们拿apple没办法,那就只有想办法绕过去啊,初步的思路是截获退格键删除行为,每点一次退格键删除时只允许删除一个字符。这就要用到UITextFieldDelegate的一个textField:shouldChangeCharactersInRange:replacementString方法,这个方法是在UITextField的内容改变时调用,第二个参数表明内容改变的范围,第三个参数是替代的字符串。代码如下:
Here’s Code
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
if (range.location & 0 && range.length == 1 && string.length == 0)
textField.text = [textField.text substringToIndex:textField.text.length - 1];
return NO;
return YES;
设置一下UITextField的delegate就可以调用到此方法,range.length == 1 && string.length == 0就是删除一个字符时所满足的条件,如果条件满足,就只让textField的内容减少一个字符。初步测试,可以解决退格变清空的问题,但是又带来另一个问题:如果是在文字中间点退格键删除文字,就变成从文字的最后删除一个字符。这并不是我们想要的,怎么办呢,那就要找到删除的字符的位置,这个
里给了一个终极解决办法,代码如下:
Here’s Code
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
if (range.location & 0 && range.length == 1 && string.length == 0)
// Stores cursor position
UITextPosition *beginning = textField.beginningOfDocument;
UITextPosition *start = [textField positionFromPosition:beginning offset:range.location];
NSInteger cursorOffset = [textField offsetFromPosition:beginning toPosition:start] + string.length;
// Save the current text, in case iOS deletes the whole text
NSString *text = textField.text;
// Trigger deletion
[textField deleteBackward];
// iOS deleted the entire string
if (textField.text.length != text.length - 1)
textField.text = [text stringByReplacingCharactersInRange:range withString:string];
// Update cursor position
UITextPosition *newCursorPosition = [textField positionFromPosition:textField.beginningOfDocument offset:cursorOffset];
UITextRange *newSelectedRange = [textField textRangeFromPosition:newCursorPosition toPosition:newCursorPosition];
[textField setSelectedTextRange:newSelectedRange];
return NO;
return YES;
思路是先取到光标位置,把文本内容暂存,清空原来UITextField的内容,然后将暂存的文本内容中光标左侧的文字replace掉重新赋给UITextField,并恢复光标位置,难点在于怎么获取光标位置与恢复光标位置。
一般用到用户名与密码UITextField的地方用这个方法就能解决问题了,只是还有点小问题,即如果不是从中间删除一个字符,而是一次删除若干个字符还是有问题的,这是由if中的range.length == 1条件限制的,稍加改造下应该就能解决。另外一个问题是如果有中文字符或其它UTF8字符,估计得考虑一下是不是应该要用“text.length – 1”,不过能有多少应用的用户名或密码带中文呢
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示UITextField属性_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
UITextField属性
上传于||暂无简介
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
你可能喜欢IOS-TextField知多少_百度知道
IOS-TextField知多少
提问者采纳
  /  typedef enum {  UITextAutocorrectionTypeDefault.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter.text = @&quot,此类中有一个属性contentVerticalAlignment  text.secureTextEntry = YES,用于一次性删除输入框中的内容  text:@&quot, 130;  &#47.默认是保持原来大小;设置背景  text,  UITextBorderStyleBezel,
除了编辑外都出现  UITextFieldViewModeAlways
一直出现  } UITextFieldViewMode:@&  /cc.disabledBackground = [UIImage imageNamed,
重不出现  UITextFieldViewModeWhileE每输入一个字符就变成点 用语密码输入  /  &#47.font = [UIFont fontWithName.borderStyle = UITextBorderStyleRoundedRect,在什么时候显示;  ///  /  typedef enum {  UITextBorderStyleNone.textAlignment = UITextAlignmentL/设置字体颜色  text.autocorrectionType = UITextAutocorrectionTypeNo;  /&#47.0f];  / size,
不自动纠错  UITextAutocorrectionTypeY设置为YES时文本会自动缩小以适应文本窗口大小:CGRectMake(20.adjustsFontSizeToFitWidth = YES;  /;password&&#47.textColor = [UIColor redColor],水印提示 提示内容为password  text:@&/  /],而让长文本滚动  textF];再次编辑就清空  /  //  /设置背景    &#47, 编辑时出现  UITextFieldViewModeUnlessEditing,此时设置为白色 如果使用了自定义的背景图片边框会被忽略掉  text.placeholder = @&内容的垂直对齐方式
UITextField继承自UIControl,  UITextBorderStyleL初始化textfield并设置位置及大小  UITextField *text = [[UITextField alloc]initWithFrame,只有设置了才会显示边框样式  /  /输入框中一开始就有的文字  text, 20  &#47.clearsOnBeginEditing = YES;内容对齐方式  设置输入框内容的字体样式和大小  ;&#47.png&是否纠错  一开始就在输入框的文字&输入框中是否有个叉号;//dd,
自动纠错  } UITextAutocorrectionT当输入框没有内容时.background = [UIImage imageN设置输入框的背景颜色;设置边框样式;  //  /&#47.backgroundColor = [UIColor whiteColor],  UITextBorderStyleRoundedRect  } UITextBorderS  typedef enum {  UITextFieldViewModeNever.clearButtonMode = UITextFieldViewModeAlways.png&&#47, 30)];&#47, 默认  UITextAutocorrectionTypeNo:20;Arial&设置自动缩小显示的最小字体大小  text.minimumFontSize = 20
网络管理与维护
其他类似问题
为您推荐:
textfield的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁怎样完全清空UITextField里的内容_百度知道
怎样完全清空UITextField里的内容
提问者采纳
buttonTpye = 0。首先说下我的目的是不停的按清屏,num];
displayString=[[NSMutableString alloc] init];/
if (buttonTpye == 0) {
[displayString appendFormat:displayString],num],__FUNCTION__);,就自己想了一个笨办法;/%s&
NSLog(@&//,inputTextField,然后输入数字后.text,今天才学UI;
[inputTextField setT
}else{[displayString appendF%@%i&判断是否要清屏}第二步再你要修改内容的那里添加一个if语句-(IBAction)number我想了半天没找到简便的方法;重新置为初始的0
buttonTpye = 1;
[inputTextField setT}前段时间一直学的OC:@&quot:(id)sender{
NSInteger num = [sender tag]:@&];%i&quot:displayString]:@&quot,如果谁知道直接清空的方法;。第一步先在清空的方法下面加上-(IBAction)clear{
[inputTextField setText,很多方法不知道;0&quot,数字的前面不会出现null或者其他符号
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁怎么在UITextField添加一个清除按钮_百度知道
怎么在UITextField添加一个清除按钮
按下面的做就行了。cell = [tableView dequeueReusableCellWithIdentifier:@&CellNameIdentifier&];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@&CellName& owner:self options:nil];
cell = cellN
[cellName setAccessoryType:UITableViewCellAccessoryNone];
//textfield in inside cellName
textfield.clearButtonMode = UITextFieldViewModeWhileE}
其他类似问题
为您推荐:
uitextfield的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 uitextfield 清空按钮 的文章

 

随机推荐