当我向int[][] arr = new int[9][9];
// all values in arr will be 0
添加leftView
(或righView
),然后将UITextField
返回NO
时,我发现了一种奇怪的行为当试图再次访问视图控制器时(一个人会想到一个新的实例),有时我得到一个EXC_BAD_ACCESS,有时候文本字段没有响应。
我不知道为什么会发生这种情况,所以我会在重复步骤下面发帖。
从一个带有导航控制器和2个视图控制器的非常简单的项目开始,第一个只有一个按钮可以转到第二个,第二个只有一个textFieldShouldEndEditing
。
第二个控制器的UITextField
是UIViewController
代表:
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
,一切正常;但我想给用户一个视觉反馈,说明为什么文本字段不允许他们离开。
我更新了视图控制器代码,以便在视图控制器被取消分配之前尝试确保leftView
辞职的第一响应者,但即使进行了这些更改,重新进入textField
时也没有响应:
textField
答案 0 :(得分:0)
请注意,即使您返回NO
,UIKit
也会在离开第二个控制器时结束编辑。
考虑这种情况,您返回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,则问题仍然存在,如果不满足文本字段条件,则应该阻止用户返回第一个视图控制器。