textFieldDidEndEditing 替代

Posted

技术标签:

【中文标题】textFieldDidEndEditing 替代【英文标题】:textFieldDidEndEditing alternative 【发布时间】:2011-06-05 15:32:22 【问题描述】:

您好,我正在使用以下代码来保持 2 个 UIButtons 禁用,直到四个 UITextFields 中有数据

- (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 时,应用程序冻结

如何将文本字段更改通知合并到 textFieldDidEndEditing

textFieldDidEndEditing vs didSelectRowAtIndexPath,后者不被调用