Having a UITextField in a UITableViewCell Having a UITextField in a UITableViewCell objective-c objective-c

Having a UITextField in a UITableViewCell


Try this out. Works like a charm for me (on iPhone devices). I used this code for a login screen once. I configured the table view to have two sections. You can of course get rid of the section conditionals.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];if (cell == nil) {    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault                                    reuseIdentifier:kCellIdentifier] autorelease];    cell.accessoryType = UITableViewCellAccessoryNone;    if ([indexPath section] == 0) {        UITextField *playerTextField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)];        playerTextField.adjustsFontSizeToFitWidth = YES;        playerTextField.textColor = [UIColor blackColor];        if ([indexPath row] == 0) {            playerTextField.placeholder = @"example@gmail.com";            playerTextField.keyboardType = UIKeyboardTypeEmailAddress;            playerTextField.returnKeyType = UIReturnKeyNext;        }        else {            playerTextField.placeholder = @"Required";            playerTextField.keyboardType = UIKeyboardTypeDefault;            playerTextField.returnKeyType = UIReturnKeyDone;            playerTextField.secureTextEntry = YES;        }               playerTextField.backgroundColor = [UIColor whiteColor];        playerTextField.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support        playerTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support        playerTextField.textAlignment = UITextAlignmentLeft;        playerTextField.tag = 0;        //playerTextField.delegate = self;        playerTextField.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right        [playerTextField setEnabled: YES];        [cell.contentView addSubview:playerTextField];        [playerTextField release];    }}if ([indexPath section] == 0) { // Email & Password Section    if ([indexPath row] == 0) { // Email        cell.textLabel.text = @"Email";    }    else {        cell.textLabel.text = @"Password";    }}else { // Login button section    cell.textLabel.text = @"Log in";}return cell;    }

Result looks like this:

login form


Here is a solution that looks good under iOS6/7/8/9.

Update 2016-06-10: this still works with iOS 9.3.3

Thanks for all your support, this is now on CocoaPods/Carthage/SPM at https://github.com/fulldecent/FDTextFieldTableViewCell

Basically we take the stock UITableViewCellStyleValue1 and staple a UITextField where the detailTextLabel is supposed to be. This gives us automatic placement for all scenarios: iOS6/7/8/9, iPhone/iPad, Image/No-image, Accessory/No-accessory, Portrait/Landscape, 1x/2x/3x.

enter image description here

Note: this is using storyboard with a UITableViewCellStyleValue1 type cell named "word".

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    cell = [tableView dequeueReusableCellWithIdentifier:@"word"];    cell.detailTextLabel.hidden = YES;    [[cell viewWithTag:3] removeFromSuperview];    textField = [[UITextField alloc] init];    textField.tag = 3;    textField.translatesAutoresizingMaskIntoConstraints = NO;    [cell.contentView addSubview:textField];    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:cell.textLabel attribute:NSLayoutAttributeTrailing multiplier:1 constant:8]];    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeTop multiplier:1 constant:8]];    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeBottom multiplier:1 constant:-8]];    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:cell.detailTextLabel attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]];    textField.textAlignment = NSTextAlignmentRight;    textField.delegate = self;    return cell;}


Here is how I have achieved this:

TextFormCell.h

#import <UIKit/UIKit.h>#define CellTextFieldWidth 90.0#define MarginBetweenControls 20.0@interface TextFormCell : UITableViewCell { UITextField *textField;}@property (nonatomic, retain) UITextField *textField;@end

TextFormCell.m

#import "TextFormCell.h"@implementation TextFormCell@synthesize textField;- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier {    if (self = [super initWithReuseIdentifier:reuseIdentifier]) {  // Adding the text field  textField = [[UITextField alloc] initWithFrame:CGRectZero];  textField.clearsOnBeginEditing = NO;  textField.textAlignment = UITextAlignmentRight;  textField.returnKeyType = UIReturnKeyDone;  [self.contentView addSubview:textField];    }    return self;}- (void)dealloc { [textField release];    [super dealloc];}#pragma mark -#pragma mark Laying out subviews- (void)layoutSubviews { CGRect rect = CGRectMake(self.contentView.bounds.size.width - 5.0,         12.0,         -CellTextFieldWidth,         25.0); [textField setFrame:rect]; CGRect rect2 = CGRectMake(MarginBetweenControls,       12.0,         self.contentView.bounds.size.width - CellTextFieldWidth - MarginBetweenControls,         25.0); UILabel *theTextLabel = (UILabel *)[self textLabel]; [theTextLabel setFrame:rect2];}

It may seems a bit verbose, but it works!

Don't forget to set the delegate!