通知回调中的睡眠功能无法按预期工作

时间:2015-08-05 16:17:17

标签: ios objective-c

我使用UIAlertView接受一些用户输入。但并非所有角色都被允许。当用户键入无效字符时,应发生以下情况:

  • 文本字段的背景颜色应变为红色
  • 文本字段中的
  • 文本应更改为“无效字符”
  • 1秒睡觉
  • 1秒后再次将背景颜色变为白色并填写 没有无效字符的正确文字

好的,这是我到目前为止所做的:

- (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有问题吗?我还能做些什么才能使更改在一秒钟内可见并在之后重做它们?

1 个答案:

答案 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 - 您的代码错误地认为无效字符是文本字段中的最后一个字符。请记住,用户可以通过移动光标在文本字段的任意位置插入文本。用户还可以粘贴文本,此时任何数量的字符都可能无效。