ios编辑textfield无限循环

时间:2013-03-27 20:29:32

标签: ios ios5 uitextfield uitextfielddelegate

问题:我有一个处理editingChanged事件的方法和另一个从对象模型更新文本字段的方法。问题是,如果我修改发送事件的字段的文本,它会再次触发editingChanged并进入无限循环(仅在ios 5中)!

示例:

- (IBAction)updateFields:(UITextField *)sender {
    if ([self myCustomValidation:sender]) {
        ... //update model
        //call another method that essentially does this
        field1.text = @"someformatted text"; //causes infinite loop if any field == sender
        field2.text = @"some more text";
    }
}

您如何解决此问题(无需将sender传递给发送setText:条消息的所有方法)?

2 个答案:

答案 0 :(得分:2)

考虑实施UITextFieldDelegate方法textField:shouldChangeCharactersInRange:replacementString:,而不是注册editingChanged控制事件。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    ... //update model
    //call another method that essentially does this
    field1.text = @"someformatted text";  //causes infinite loop any field == sender
    field2.text = @"some more text";
    return YES; // or NO, depending on you actions
}

根据documentation,它应该符合您的目的

  

只要用户键入新文本,文本字段就会调用此方法   文本字段中的字符或删除现有字符。

答案 1 :(得分:1)

不要编写自己的IBAction方法,只需实现UITexFeild委托。

要检测修改文字,请实施shouldChangeCharactersInRange委托。

要检测结束编辑,请实施textFieldDidEndEditing委托。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range      replacementString:(NSString *)string
{
  //write ur code here
  return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField{

}