如何以编程方式禁用按钮?

时间:2013-08-04 13:19:28

标签: objective-c uibutton

我有两个文本字段和一个按钮。 我的目标是只有当两个文本字段都包含一些文本时才启用该按钮。

这就是我的所作所为:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    .....
    self.btnLogIn.enabled=NO;
}

我以编程方式创建文本字段,这是代码:

UITextField *textField = [[UITextField alloc] init];
......
textField.delegate=self;
[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];

这是事件处理程序:

-(void)textChanged:(UITextField *)textField
{
    UITextField *txtPassword = (UITextField *)[self.view viewWithTag:102];
    UITextField *txtUsername = (UITextField *)[self.view viewWithTag:101];
    if([txtPassword.text length]>0 && [txtUsername.text length]>0)
    {
        self.btnLogIn.enabled=YES;
    }
    else
    {
        self.btnLogIn.enabled=NO;
    }
}

我提出了三个断点:

  • self.btnLogIn.enabled = NO; (在viewDidLoad中)
  • self.btnLogIn.enabled = YES; (在textChanged中)
  • self.btnLogIn.enabled = NO; (在textChanged中)

当我运行应用程序时,它会点击所有制动点,但按钮仍然处于启用状态。

如果我从设计器中取消选中“已启用”,则会始终禁用它。

我做错了什么?

LE:我拖动了实现文件中的按钮来创建插座,这是代码:

@property (weak, nonatomic) IBOutlet UIButton *btnLogIn;

3 个答案:

答案 0 :(得分:1)

确保已创建并连接插座。仅仅在代码中创建插座是不够的,您也需要连接它。当您从XIB拖出连接到代码时,它会为您创建插座并应该连接它,但检查它是否存在。您也可能意外地解除了部分更改或断开了连接。调试以在运行时检查变量不是nil也是第一个调用端口。

答案 1 :(得分:0)

如果您有出口并且两个文本字段的代理都已设置:

- (BOOL)textField:(UITextField *)textField 
  shouldChangeCharactersInRange:(NSRange)range 
              replacementString:(NSString *)string {

   NSString *completeText = 
         [textField.text stringByReplacingCharactersInRange:range
                                                 withString:string];
   self.button.enabled = completeText.length && 
        textField == firstTextField ?
              otherTextField.length : 
              firstTextField.length;

}

答案 2 :(得分:0)

您可以使用以下方法验证文本字段:

        if(txtPassword.text >0 && txtUsername.text >0){

// Code here for login process
    }

else{

    // Code here to inform user nothing has been entered for example a UIAlert
}

或者使用:

       if(txtPassword.text == nil && txtUsername.text == nil){
            // Code here to inform user nothing has been entered for example a UIAlert
    }

else{

// Code here for login process

}

加上而不是:self.btnLogIn.enabled=NO;您是否可以使用btnLogIn.UserInteractionEnabled = NO;然后根据需要将其设置回btnLogIn.UserInteractionEnabled = YES;