我使用UIAlertView
接受一些用户输入。但并非所有角色都被允许。当用户键入无效字符时,应发生以下情况:
好的,这是我到目前为止所做的:
- (void)alertEditFloor {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:lang(@"ALERT_TITLE")
message:lang(@"ALERT_MESSAGE")
delegate:nil
cancelButtonTitle:lang(@"BUTTON_CANCEL")
otherButtonTitles:lang(@"BUTTON_OK"), nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert textFieldAtIndex:0].placeholder = @"Something";
[alert textFieldAtIndex:0].text = @"Some Text";
[alert textFieldAtIndex:0].clearButtonMode = UITextFieldViewModeAlways;
[[alert textFieldAtIndex:0] setBackgroundColor:[UIColor whiteColor]];
alert.delegate = self;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(controlTextDidChange:) name:UITextFieldTextDidChangeNotification object:[alert textFieldAtIndex:0]];
[alert show];
}
- (void)controlTextDidChange:(NSNotification *)notification {
UITextField *theTextField = (UITextField*)[notification object];
if(![theTextField.text containsOnlyValidChars:[self getValidCharsWithSpace]]){
NSString *tmpText = theTextField.text;
[theTextField setBackgroundColor:[UIColor redColor]];
[theTextField setText:@"Invalid character"];
sleep(1);
theTextField.backgroundColor = [UIColor whiteColor];
theTextField.text = [tmpText substringToIndex:[tmpText length]-1];
}
}
通知正常。我用断点和NSLog测试了它。 if-block也可以正常工作。每当我输入无效字符时,应用程序都会进入if块。
问题是if-block中的语句不是一步一步执行的。首先执行所有文本字段更改,然后应用程序冻结一秒钟。因此,在删除最后一个(无效)字符时,不会看到任何变化。当我推荐最后两个文本字段更改时,字段变为红色,文本显示“无效字符”并且应用程序冻结。但当然在冻结后我希望文本字段再次变白。
有人有想法吗?在通知回调中使用sleep有问题吗?我还能做些什么才能使更改在一秒钟内可见并在之后重做它们?
答案 0 :(得分:3)
永远不要阻止主线程。您的代码永远不会给第一个颜色和文本更改在完成第二个之前完成的机会。
您想要的是在适当的延迟后执行更改。像这样:
if(![theTextField.text containsOnlyValidChars:[self getValidCharsWithSpace]]){
NSString *tmpText = theTextField.text;
[theTextField setBackgroundColor:[UIColor redColor]];
[theTextField setText:@"Invalid character"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
theTextField.backgroundColor = [UIColor whiteColor];
theTextField.text = [tmpText substringToIndex:[tmpText length]-1];
});
}
BTW - 您的代码错误地认为无效字符是文本字段中的最后一个字符。请记住,用户可以通过移动光标在文本字段的任意位置插入文本。用户还可以粘贴文本,此时任何数量的字符都可能无效。