2

I would like to add a clear button inside a UITextfield but it doesn't show up.

This the code for the UITextfield:

  @implementation databaseEnterDataViewController

@synthesize customer = customer_ ;
@synthesize type = type_ ;
@synthesize code1 = code1_ ;
@synthesize code2 = code2_ ;
@synthesize background,
            changeType,
            codeOne,
            codeTwo,
            customers,
            suspendDisplayInfo,
            tf;


#pragma mark -
#pragma mark Initialization

#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];

    self.customer = @"" ;
    self.type     = @"" ;
    self.code1    = @"" ;
    self.code2    = @"" ;

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Save" style:UIBarButtonSystemItemCancel target:self action:nil];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:nil];
    self.navigationItem.title = @"Enter Data";

    code1Field_.clearButtonMode = UITextFieldViewModeWhileEditing;
    code2Field_.clearButtonMode = UITextFieldViewModeUnlessEditing;
    customerField_.clearButtonMode = UITextFieldViewModeAlways;


    [self openDB];
    [self createTable:@"barcodeScan" withField1:@"key" withField2:@"scanDate" withField3:@"theCustomer" withField4:@"type" withField5:@"theCode1" withField6:@"theCode2" withField7:@"discription" withField8:@"articleNr" withField9:@"batchNr" withField10:@"serialNr" withField11:@"expDate"];

    self.suspendDisplayInfo=false;
    NSLog(@"%@",typeLabel_.text);









#ifdef LOG_FILE
    NSFileManager *fileManger = [NSFileManager defaultManager];
    if ([fileManger fileExistsAtPath:[self getLogFile]])
    {
        [debug appendString:[[NSString alloc] initWithContentsOfFile:[self getLogFile]]];
        [debugText setText:debug];
    }
#endif

    dtdev=[Linea sharedDevice];
    [dtdev addDelegate:self];
    [dtdev connect];




    types = [[NSMutableArray alloc] init];
    [types addObject:@"Select barcode type"];
    [types addObject:@"Intervascular"];
    [types addObject:@"CID"];
    [types addObject:@"MAQUET"];


    [self pickerview];

    tf.clearButtonMode =UITextFieldViewModeAlways;


}




- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return 4;
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    // Make cell unselectable
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

     tf = nil;
    tf.clearButtonMode =UITextFieldViewModeAlways;
    changeType = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    changeType.frame = CGRectMake(cell.frame.origin.x + 220, cell.frame.origin.y + 7, 80, 30);
    [changeType setTitle:@"Change type" forState:UIControlStateNormal];
    changeType.backgroundColor= [UIColor clearColor];
   [changeType.titleLabel setFont:[UIFont systemFontOfSize:14]];
    [changeType addTarget:self action:@selector(clickeButton:) forControlEvents:UIControlEventTouchDown];


    switch ( indexPath.row ) {
        case 0: {
            cell.textLabel.text = @"Customer:" ;
            tf = customerField_ = [self makeTextField:self.customer placeholder:@"Customer name"];
            [cell addSubview:customerField_];


            break ;
        }
        case 1: {
            cell.textLabel.text = @"Type:" ;
            tf = typeLabel_ = [self makeTextField:self.type placeholder:@"Type code"];
            [cell addSubview:typeLabel_];
            [cell addSubview:changeType];

            break ;
        }
        case 2: {
            cell.textLabel.text = @"Code 1:" ;
            tf = code1Field_ = [self makeTextField:self.code1 placeholder:@"Code 1"];
            [cell addSubview:code1Field_];
            break ;
        }
        case 3: {
            cell.textLabel.text = @"Code 2:" ;
            tf = code2Field_ = [self makeTextField:self.code2 placeholder:@"code 2"];
            [cell addSubview:code2Field_];
            break ;
        }
    }

    // Textfield dimensions
    tf.frame = CGRectMake(120, 12, 170, 30);

    // Workaround to dismiss keyboard when Done/Return is tapped
    [tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];

    // We want to handle textFieldDidEndEditing
    tf.delegate = self ;

    return cell;
}





-(UITextField*) makeTextField: (NSString*)text
                  placeholder: (NSString*)placeholder  {
    UITextField*tf = [[UITextField alloc] init];
    tf.placeholder = placeholder ;
    tf.text = text ;
    tf.autocorrectionType = UITextAutocorrectionTypeNo ;
    tf.autocapitalizationType = UITextAutocapitalizationTypeNone;
    tf.adjustsFontSizeToFitWidth = YES;
    tf.textColor = [UIColor colorWithRed:56.0f/255.0f green:84.0f/255.0f blue:135.0f/255.0f alpha:1.0f];
    return tf ;
}

// Workaround to hide keyboard when Done is tapped
- (IBAction)textFieldFinished:(id)sender {
    // [sender resignFirstResponder];
}

// Textfield value changed, store the new value.
- (void)textFieldDidEndEditing:(UITextField *)textField {
    if ( textField == customerField_ ) {
        self.customer = textField.text ;
    }
    else if ( textField == typeLabel_ ) {
        self.type = textField.text ;
    }
    else if ( textField == code1Field_ ) {
        self.code1 = textField.text ;
    }
    else if ( textField == code2Field_ ) {
        self.code2 = textField.text ;
    }
}

On the iphone it looks like this:

enter image description here

When I add the clear button like this

customerField_.clearButtonMode = UITextFieldViewModeWhileEditing;

the button doesn't show up.

What should I do to make it visible?

Thymen
  • 220
  • 3
  • 10
  • 2
    It's called `UITextFieldViewModeWhileEditing` because the button is only visible while editing. Editing means your field is the first responder, and the keyboard is up. Try `UITextFieldViewModeAlways` – Matthias Bauch May 11 '13 at 09:58

2 Answers2

6

If you use UITextFieldViewModeAlways, you'll see the button if the string of the textfield is not nil or if its lenght is > 0. I think that you can't to show the clearbutton if there is nothing to clear.

Mat
  • 7,613
  • 4
  • 40
  • 56
  • It doesn't work when i put text in it at all – Thymen May 11 '13 at 10:15
  • 1
    In the cellForRowAtIndexPath you're setting the clearButton on a nil object, try to set it in the switch in the case 0 , just after the textfield initialization. – Mat May 11 '13 at 10:26
3

If you want the clear button to be always visible, then you need to set the text field's clearButtonMode property to UITextFieldViewModeAlways. The way you've currently configured the text field, the clear button only shows itself when the text field is being edited.

EDIT: As Mat points out in the comments, no matter what value the text field's clearButtonMode property is given, the clear button is only shown if it is relevant, that is, if there is something to clear. If the text field is empty, there is no need to show the clear button.

Bart Jacobs
  • 9,022
  • 7
  • 47
  • 88