textFieldDidEndEditing 替代
Posted
技术标签:
【中文标题】textFieldDidEndEditing 替代【英文标题】:textFieldDidEndEditing alternative 【发布时间】:2011-06-05 15:32:22 【问题描述】:您好,我正在使用以下代码来保持 2 个 UIButtons
禁用,直到四个 UITextField
s 中有数据
- (void)textFieldDidBeginEditing:(UITextField *)textField
if (([brand.text length] >0) && ([qty.text length] >0) && ([size.text length] >0) && ([price.text length] >0))
[calcOneButton setEnabled:YES];
[calcTwoButton setEnabled:YES];
if (([brand.text length] ==0) || ([qty.text length] ==0) || ([size.text length] ==0) || ([price.text length] ==0))
[calcOneButton setEnabled:NO];
[calcTwoButton setEnabled:NO];
- (void)textFieldDidEndEditing:(UITextField *)textField
int ebtl = [brand.text length];
int eqtl = [qty.text length];
int estl = [size.text length];
int eptl = [price.text length];
NSLog(@"ebtl = %d eqtl = %d estl = %d eptl = %d",ebtl, eqtl, estl, eptl);
if (([brand.text length] ==0) || ([qty.text length] ==0) || ([size.text length] ==0) || ([price.text length] ==0))
[calcOneButton setEnabled:NO];
[calcTwoButton setEnabled:NO];
if (([brand.text length] >0) && ([qty.text length] >0) && ([size.text length] >0) && ([price.text length] >0))
[calcOneButton setEnabled:YES];
[calcTwoButton setEnabled:YES];
我的问题是textFieldDidEndEditing
直到用户点击离开文本字段时才会被调用。这就需要点击屏幕然后按钮有没有办法避免这种情况,所以按钮会立即启用?
【问题讨论】:
【参考方案1】:只有当用户点击离开 textField 时,该按钮才会变为活动状态。如果您使用的是弹出的普通键盘,请使用键盘上的DONE按钮摆脱键盘,然后在键盘自行退出时编写IBAction,然后启用您的按钮。
- (BOOL) textFieldShouldReturn:(UITextField *)textField
[textField resignFirstResponder]; //enable your buttons after this
return 1;
或使用 IBAction:
-(IBAction) textFieldFinishedDone: (id) sender; // enable your buttons after this
只有在所有文本字段都填满时,按钮才必须激活,对吗?你可以这样做。 注释掉你上面写的两个函数。使用 IBAction,每当您按下 DONE 并退出键盘时,检查所有文本字段的状态。使用 if-else 块,让您的按钮在所有文本字段完成后出现。
【讨论】:
我只在其中一个字段上使用普通键盘,其他3个都是数字键盘。我可以将操作链接到字段事件属性中的 Editing Changed 或 Value changed 吗? 使用本教程为数字键盘创建返回键。 neoos.ch/news/46-development/… 对不起,我没有正确阅读您的问题;完成所有文本字段后,按钮必须激活?? 是的,没错,我已经使用文本字段的事件编辑 cahnged 属性将它链接到一个动作。感谢您的帮助【参考方案2】:为了获得最佳用户体验,我建议执行 textField:shouldChangeCharactersInRange:replacementString:
中的行为,始终返回 YES。
另外,上述方法中的逻辑是多余的, 首选实现:
- (void)textFieldDidBeginEditing:(UITextField *)textField
if (([brand.text length] >0) &&
([qty.text length] >0) &&
([size.text length] >0) &&
([price.text length] >0))
[calcOneButton setEnabled:YES];
[calcTwoButton setEnabled:YES];
else
[calcOneButton setEnabled:NO];
[calcTwoButton setEnabled:NO];
【讨论】:
感谢您的回复,我已经在textField:shouldChangeCharactersInRange:replacementString:
下进行了很多工作,所以我现在已经使用事件编辑更改属性链接到一个操作。以上是关于textFieldDidEndEditing 替代的主要内容,如果未能解决你的问题,请参考以下文章
textFieldDidEndEditing 触发“为时已晚”
textFieldDidEndEditing 未在 swift 中调用
在文本字段中插入一个字符后启用完成按钮: textFieldDidEndEditing: 或 textFieldShouldBeginEditing: 或?
当调用 textFieldDidEndEditing 时,应用程序冻结