当文本字段完成编辑时,使按钮消失,但切换到另一个文本字段

时间:2012-04-04 22:54:10

标签: objective-c uibutton uitextfield

我的UIButton设置为每次UITextField完成编辑时都会消失,我调用textFieldDidEndEditing:方法,然后让按钮逐渐消失。这很好,除非我切换到另一个文本字段而不点击第一个文本字段。例如,我在文本字段A上,只需点击文本字段B,键盘仍然保持不动,按钮也是如此。我不相信有一种方法可以覆盖像这样切换的文本字段,只有当所有文本字段都完成编辑时。我错了吗?这是我的代码:

-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField
{
negButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
negButton.frame = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, 37, textField.frame.size.height);
[negButton setAlpha:0];

return YES;
}

-(void) textFieldDidBeginEditing:(UITextField *)textField
{
if ([textField isEditing])
{
    [UIView animateWithDuration:0.3 animations:^
     {
         field = textField;

         CGRect frame = textField.frame;

         frame.size.width -= 40;
         frame.origin.x += 40;

         [negButton setAlpha:1];
         [textField setFrame:frame];
         [self.view addSubview:negButton];
     }];
}
}

-(void) textFieldDidEndEditing:(UITextField *)textField
{
    [UIView animateWithDuration:0.3 animations:^
     {

         CGRect frame = textField.frame;
         frame.size.width += 40;
         frame.origin.x -= 40;

         [negButton setAlpha:0];

         [textField setFrame:frame];
     } 
     ];
}

2 个答案:

答案 0 :(得分:1)

听起来我正在调用按钮显示在

textFieldShouldBeginEditing 

方法,很好,你要在

上删除它
textFieldDidEndEditing 

方法,也没关系。当您切换到另一个文本框时,为什么没有看到按钮消失是因为当您点击该文本框时, endEditing 方法后立即调用 shouldBeginEditing 方法,结果在删除后立即重新出现的按钮。

这是应该工作的方式,如果你想让它以不同的方式工作,你必须使代码特定于每个文本字段

EX:

- (BOOL)textFieldShouldBeginEditing:(UITextField*)textField
{
    if(textField == myField1)
    {
        //make button appear
    }
    else if(textField == myField2)
    {
        //Something else
    }
}

瞧!

答案 1 :(得分:0)

这里的问题是调用委托方法的顺序。

假设您从textField1转到textField2。

一旦textField1处于活动状态并单击textField2,就会像这样调用它们:

textFieldShouldBeginEditing (textField2)
textFieldShouldEndEditing   (textField1)
textFieldDidEndEditing      (textField1)
textFieldDidBeginEditing    (textField2)

您正在negButton中创建 textFieldShouldBeginEditing,通过在textField2旁边创建一个并存储它来覆盖对“旧”按钮(在textField1旁边)的引用引用而不是。接下来,您在新按钮上调用textFieldDidEndEditingtextFieldDidBeginEditing

您要做的是将当前位于textFieldShouldBeginEditing的代码移动到textFieldDidBeginEditing的开头,以便前两个方法在创建新方法之前对相应的按钮起作用。