启用和禁用UIBarButtonItem

时间:2012-12-07 23:13:37

标签: objective-c ios ios6 uibarbuttonitem

我有一个带有6个UITextFields和1个UIBarButtonItem的屏幕,名为“Done”。一旦用户在6个UITextField中的任何一个上键入任何内容,我想启用名为“Done”的UIBarButtonItem,并且如果用户删除内容,我想将我的UIBarByttonItem称为“done”以禁用模式。我想应用Apple在iphone议程中添加新联系人时应用的相同规则。只要您输入任何信息,您就可以点击“完成”。有什么聪明的方法吗?

非常感谢, 马科斯。

4 个答案:

答案 0 :(得分:5)

每当更改文本字段时,您都需要设置要调用的方法。将相同的方法应用于所有文本字段。在该方法中,您检查文本字段是否包含文本。根据该检查,您可以启用或禁用该按钮。

// Do this for each text field.
[textField addTarget:self action:@selector(textFieldChangedAction:) forControlEvents:UIControlEventEditingChanged];

- (void)textFieldChangedAction:(UITextField *)textField {
    if (textField.text.length) {
        // enable button
    } else {
        // In this method, check every text field for text. If any have text, enable button
        // If none have text, disable button.
    }
}

编辑:

您需要为所有文本字段设置一个实例变量,以便您可以访问所有文本字段以查看是否应该禁用该按钮。

答案 1 :(得分:1)

实施委托方法– textField:shouldChangeCharactersInRange:replacementString:并检查是否[textfield.text length] > 0。如果是,请[self.navigationItem.rightBarButtonItem setEnabled:YES];做同样的事情以禁用,但是你需要检查在这种情况下是否所有文本字段都确保它们都没有任何文本。

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

  NSString *text = [theTextField.text stringByReplacingCharactersInRange:range withString:string];   
  if ([text length] > 0){    
     [self.navigationItem.rightBarButtonItem setEnabled:YES];    
  } else {
//check for all textfields and then set [self.navigationItem.rightBarButtonItem setEnabled:NO]; In place of current textfield, you have to use `text`
  }
  return YES;
}

此方法的优点是您无需向所有6个文本字段添加操作或通知。由于代表已经设置好了,你不必担心。

答案 2 :(得分:1)

致@rmaddy回答。每次textField编辑时,它都会调用该方法并检查 SPECIFIC textFieldenable or disable barButtonItem的文本长度。但问题是启用或禁用UIBarButtonItem,如果启用了具有文本然后按钮的6个textFields中的任何一个。如果没有文本,那么只应禁用它。因此除了在视图中迭代所有textFields之外别无选择。您可以使用textField

而不是为每个UITextFieldTextDidChangeNotification编写目标

只需在viewWillAppear:方法中添加该通知,然后将其移除viewWillDisappear:方法

看看这段代码..

-(void)viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(validateFields) name:UITextFieldTextDidChangeNotification object:nil];

[super viewWillAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];

    [super viewWillDisappear:animated];
}

- (void)validateFields {

    // I think you would have outlet for all textFields.So you can check the textfields having text or not ..
     if([textField1.text length] || [textField2.text length] || ....){
           [yourBarButton setEnabled:YES];
      }else{
           [yourBarButton setEnabled:NO];
      }
  }

<强>更新

@rmaddy的答案也会奏效。不要忘记在他的答案的其他部分看到评论。现在这取决于一个用户选择的方法..

答案 3 :(得分:0)

查看控制器M.

 if (text1.text.length > 0 || text2.text.length > 0 || text3.text.length > 0 || text4.text.length > 0 || text5.text.length > 0 || text6.text.length > 0)  {

    //btnBack is your UIBarButton   
    [btnBack setTitle:@""];
    [btnBack setStyle:UIBarButtonItemStylePlain];
    [btnBack setEnabled:FALSE];
 } else {

     //btnBack is your UIBarButton     
     [btnBack setTitle:@"Done"];
     [btnBack setStyle:UIBarButtonItemStyleBordered];
     [btnBack setEnabled:TRUE];
 }

此代码检测文本字段的长度,并启用或禁用UIBarButton!