0

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

非常感谢,马科斯。

4

4 回答 4

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

编辑:

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

于 2012-12-07T23:18:29.847 回答
1

要@rmaddy 回答。对于每次textField编辑,它将调用该方法并检查该SPECIFIC textFieldenable or disable barButtonItem. 但问题是关于启用或禁用 UIBarButtonItem,如果 6 个文本字段中的任何一个具有文本,则应启用按钮。如果没有文本,那么只有它应该被禁用。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 答案也可以。不要忘记在他的答案的其他部分查看评论。现在这取决于一个用户选择的方法..

于 2012-12-08T00:20:25.553 回答
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 个文本字段添加操作或通知。由于已设置委托,因此您不必担心。

于 2012-12-07T23:17:13.170 回答
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!

于 2012-12-07T23:20:06.510 回答