【问题标题】:Enable and disable a UIBarButtonItem启用和禁用 UIBarButtonItem
【发布时间】:2012-12-07 23:13:37
【问题描述】:

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

非常感谢, 马科斯。

【问题讨论】:

  • 老兄做了 4 个答案中的任何一个都有帮助..

标签: objective-c ios ios6 uibarbuttonitem


【解决方案1】:

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

// 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.
    }
}

编辑:

您将需要一个用于所有文本字段的实例变量,以便您可以访问所有这些字段以查看是否应禁用按钮。

【讨论】:

  • @vilelam 查看我所做的关于需要实例变量的更新。
  • +1 表示if (textField.text.length) { // enable button } 。您不必比较所有文本字段来启用按钮。这就是我在回答中试图表达的观点。
  • @R.A 你不能在没有解释的情况下提出这样的要求。
  • @rmaddy 抱歉.. 请检查我的答案.. 在投票之前告诉我是否有任何问题..
  • @R.A 如果当前文本字段有文本,那么您可以启用该按钮。否则,您需要检查所有其他人。无需每次都检查每个文本字段,只要当前为空即可。要求是至少一个有文本,而不是所有文本。
【解决方案2】:

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

只需在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 回答也可以。不要忘记在他的答案的其他部分查看 cmets。现在这取决于一个用户选择的方法..

【讨论】:

    【解决方案3】:

    实现委托方法– 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 个文本字段添加操作或通知。由于代理已经设置好,您不必担心。

    【讨论】:

    • 检查此委托中文本字段的文本长度可能会给出错误的答案(至少对于当前文本字段)。
    • 此委托对所有文本字段都是通用的,因此如果任何文本字段更改其文本,则会调用此委托。因此它应该工作。唯一的问题是在禁用时,他需要检查所有使用和条件的文本字段。但这在任何情况下都是必要的。根据他的问题,如果任何文本字段有文本,则应该启用它,如果任何文本字段有文本,则此 if 条件将为真。
    • 感谢您的快速回复。我已经这样做了,但是在委托方法中,我只能检查六个 UITextField 中的一个。在调用上述方法时,我会一直检查所有这些。我不认为这将是最好的方法。但是……
    • 使用此方法不必为所有文本字段添加操作... +1
    • @vilelam,这就是为什么我补充说你必须检查[text length] 而不是textField.text 在当前文本字段的其他部分。很高兴看到我建议的if ([text length] > 0) 启用方法已实施。这是我主要针对这个答案提出的一个建议。
    【解决方案4】:

    查看控制器 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!

    【讨论】:

    • 您遗漏了最困难的部分 - 何时设置按钮的属性。 :)
    • 稍微好一点。您仍然缺少所有管道。
    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多