UITextField textFieldShouldEndEditing和leftView之间的奇怪交互

时间:2016-08-06 22:01:49

标签: ios objective-c user-interface

当我向int[][] arr = new int[9][9]; // all values in arr will be 0 添加leftView(或righView),然后将UITextField返回NO时,我发现了一种奇怪的行为当试图再次访问视图控制器时(一个人会想到一个新的实例),有时我得到一个EXC_BAD_ACCESS,有时候文本字段没有响应。

我不知道为什么会发生这种情况,所以我会在重复步骤下面发帖。

从一个带有导航控制器和2个视图控制器的非常简单的项目开始,第一个只有一个按钮可以转到第二个,第二个只有一个textFieldShouldEndEditing

The main storyboard with two view controllers.

第二个控制器的UITextFieldUIViewController代表:

UITextField

现在转到第二个视图控制器,您可以编辑文本字段没有问题,但无法停止编辑(如预期的那样),但您可以返回到第一个视图控制器(此时第二个视图控制器被处理,如在控制台上作证的那样。)

但是现在如果你再次进入第二个视图控制器(一个新的实例,我希望,因为另一个被解除分配),你会发现你无法再与文本字段进行交互。

为什么会这样?我做错了什么?

注释

  • 如果我将@interface ViewController () <UITextFieldDelegate> @property (nonatomic, weak) IBOutlet UITextField *textField; @end @implementation ViewController - (void)dealloc { NSLog(@"Dealocating View Controller"); } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { textField.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; textField.leftViewMode = UITextFieldViewModeAlways; return NO; } @end 返回YES,一切正常;但我希望将用户保留在文本字段中,直到他们输入有效文本。

  • 如果我不添加textFieldShouldEndEditing,一切正常;但我想给用户一个视觉反馈,说明为什么文本字段不允许他们离开。

编辑以回应Teja Nandamuri

我更新了视图控制器代码,以便在视图控制器被取消分配之前尝试确保leftView辞职的第一响应者,但即使进行了这些更改,重新进入textField时也没有响应:

textField

1 个答案:

答案 0 :(得分:0)

请注意,即使您返回NOUIKit也会在离开第二个控制器时结束编辑。

考虑这种情况,您返回NO以防止用户移动到另一个控件,只要您停留在同一个控制器中,这就有效。如果你离开它,一切都会被取消分配,当你再次回来时,textField将再次被实例化,UIkit认为新的文本字段是另一个,并且不允许新的textField为becomeFirstResponder ,因为旧的没有辞职的响应者。因此,您无法编辑新的textField。

添加leftView在这里没有什么区别。唯一重要的是返回YES的委托方法。因为你无法控制UIkit,并且它希望你返回YES,所以修改你的委托方法: / p>

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    if (your-condition) {
    textField.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
    textField.leftViewMode = UITextFieldViewModeAlways;

        return NO;
    }
    return YES;
}

只要您位于第二个View控制器中,此案例就可以正常工作。无论如何,如果从第二个控制器离开,并且委托方法返回NO,则问题仍然存在,如果不满足文本字段条件,则应该阻止用户返回第一个视图控制器。