我有一个控制UITextField的textColor的UIButton,我发现当我在UITextField上调用resignFirstResponder时,在文本字段作为第一响应者时对textColor所做的任何更改都将丢失,并且颜色恢复为之前的状态。成为第一响应者。我正在寻找的行为是textColor应该是文本字段为第一响应者时选择的内容。

以下是相关代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tf = [[UITextField alloc] initWithFrame:CGRectMake(0.0f, 120.0f, self.view.bounds.size.width, 70.0f)];
    self.tf.delegate = self;
    self.tf.text = @"black";
    self.tf.font = [UIFont fontWithName:@"AvenirNext-DemiBold" size:48.0f];
    self.tf.textColor = [UIColor blackColor];
    [self.view addSubview:self.tf];
    self.tf.textAlignment = UITextAlignmentCenter;

    UIButton *b = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 220.0f, self.view.bounds.size.width, 20.0f)];
    [b addTarget:self action:@selector(changeColor:) forControlEvents:UIControlEventTouchUpInside];
    [b setTitle:@"Change color" forState:UIControlStateNormal];
    [b setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal];
    [self.view addSubview:b];
}

- (void)changeColor:(UIButton *)button {
    if ([self.tf.textColor isEqual:[UIColor blackColor]]) {
        self.tf.text = @"red";
        self.tf.textColor = [UIColor redColor];
    } else {
        self.tf.text = @"black";
        self.tf.textColor = [UIColor blackColor];
    }
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

更具体地说,该行为是由以下操作产生的:
  • UITextField * tf最初为黑色。
  • 点击tf成为FirstResponder。
  • 点击UIButton * b,tf.textColor更改为红色(文本也更改为@“red”,尽管这不是必需的)。
  • 点按键盘返回到resignFirstResponder,tf.textColor恢复为黑色(文本保持为@“red”)。

  • 类似地,如果初始textColor为红色,则textField将恢复为红色。

    我创建了一个示例项目,其中仅包含产生此行为所需的功能(可用here)。提前致谢。

    最佳答案

    解决方法是,只需在按下按钮时将所选颜色存储在属性上,然后执行以下操作:

    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
        [textField resignFirstResponder];
        textField.textColor = self.selectedColor;
        return YES;
    }
    

    更新

    如评论中所述,放置此替代方法的更好位置似乎在textFieldDidEndEditing中,因为它可以处理在字段之间跳转的情况:
    - (void)textFieldDidEndEditing:(UITextField *)textField {
        textField.textColor = self.selectedColor;
    }
    

    关于ios - UITextField textColor在resignFirstResponder之后恢复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22285492/

    10-08 20:52