Objective c 编辑完一个文本字段后,使按钮消失,但切换到另一个文本字段

Objective c 编辑完一个文本字段后,使按钮消失,但切换到另一个文本字段,objective-c,uibutton,uitextfield,Objective C,Uibutton,Uitextfield,每次编辑完我的UITextField后,我的UIButton设置为消失,我调用textfielddidediting:方法,然后让按钮消失。这很好,除非我在没有点击第一个文本字段的情况下切换到另一个文本字段。举个例子,我在文本字段A上,只要点击文本字段B,键盘和按钮仍然保持不动。我不相信有一种方法可以覆盖文本字段这样的切换,只有当所有文本字段都完成编辑时。我错了吗?这是我的密码: -(BOOL) textFieldShouldBeginEditing:(UITextField *)textFie

每次编辑完我的
UITextField
后,我的
UIButton
设置为消失,我调用
textfielddidediting:
方法,然后让按钮消失。这很好,除非我在没有点击第一个文本字段的情况下切换到另一个文本字段。举个例子,我在文本字段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];
     } 
     ];
}

在我看来,您似乎正在调用按钮以显示在屏幕上

textFieldShouldBeginEditing 
方法,这很好,您将在

textFieldDidEndEditing 
方法,也很好。切换到另一个文本框时,您没有看到按钮消失的原因是,当您点击该文本框时,shouldBeginEditing方法会在endEditing方法之后立即调用,导致按钮在删除后立即重新出现

这就是它的工作方式,如果您希望它以不同的方式工作,则必须使代码特定于每个文本字段

例:


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

假设您从textField1转到textField2

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

textFieldShouldBeginEditing (textField2)
textFieldShouldEndEditing   (textField1)
textFieldDidEndEditing      (textField1)
textFieldDidBeginEditing    (textField2)
您正在
textfield shouldBeginediting
中创建新的
negButton
,它通过在textField2旁边创建一个按钮并存储其引用来覆盖对“旧”按钮(在textField1旁边)的引用。接下来,在新建按钮上调用
textfielddidediting
textfielddidebeginediting


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

如何使用新方法调用的
textFieldShouldBeginEditing:
选择textfield以知道用户切换了textfield?那么你是说让它消失?你是如何让按钮出现的?这不是你想要的行为吗?这应该是
textfielddendediting:
。(并且未完成编辑)。打字错误?好的,在文本字段A中,当它切换到文本字段B时,文本字段A中的按钮保持不变,但是文本字段B会出现一个新的按钮。但是,文本字段A中的按钮不应该消失吗?而且,当你切换到不同的视图时,按钮仍然保持不变。嗯,我确实假设您正在从textFieldDidEndEditing方法的超级视图中删除按钮。我尝试了,但仍然没有成功。我真的不明白我做错了什么,我已经调试了这么多,但它仍然没有工作。凯,谢谢。在此之前我已经想出了一个办法,但这是一个有用的答案。
textFieldShouldBeginEditing (textField2)
textFieldShouldEndEditing   (textField1)
textFieldDidEndEditing      (textField1)
textFieldDidBeginEditing    (textField2)